【bzoj2242】計算器
阿新 • • 發佈:2017-05-20
using printf == div pac clas () can span
1 #include<bits/stdc++.h> 2 #define inf 1000000000 3 using namespace std; 4 typedef long long ll; 5 int gcd(int a,int b){return b==0?a:gcd(b,a%b);} 6 void exgcd(int a,int b,int &x,int &y){ 7 if(b==0){x=1;y=0;return;} 8 exgcd(b,a%b,x,y); 9 int t=x;x=y;y=t-a/b*y; 10 } 11 int solve1(ll y,intz,int p){ 12 y%=p;ll ans=1; 13 for(int i=z;i;i>>=1,y=y*y%p)if(i&1)ans=ans*y%p; 14 return ans; 15 } 16 void solve2(ll y,int z,int p){ 17 p=-p;int t=gcd(y,p); 18 if(z%t){puts("Orz, I cannot find x!");return;} 19 y/=t;z/=t;p/=t;int a,b;exgcd(y,p,a,b); 20 a=1LL*a*z%p;while(a<0)a+=p; 21 printf("%d\n",a); 22 } 23 map<int,int>mp; 24 void solve3(int y,int z,int p){ 25 y%=p;if(!y&&!z){puts("-1");return;} 26 if(!y){puts("Orz, I cannot find x!");return;} 27 mp.clear(); 28 ll m=ceil(sqrt(p)),t=1; 29 mp[1]=m+1; 30 for(ll i=1;i<m;i++){t=t*y%p;if(!mp[t])mp[t]=i;} 31 ll tmp=solve1(y,p-m-1,p),ine=1; 32 for(ll k=0;k<m;k++){ 33 int i=mp[z*ine%p]; 34 if(i){ 35 if(i==m+1)i=0; 36 printf("%lld\n",k*m+i);return; 37 } 38 ine=ine*tmp%p; 39 } 40 puts("Orz, I cannot find x!"); 41 } 42 inline int read(){ 43 int f=1,x=0;char ch; 44 do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘); 45 do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘); 46 return f*x; 47 } 48 int main(){ 49 int T=read(),k=read(); 50 while(T--){ 51 int y=read(),z=read(),p=read(); 52 if(k==1)printf("%d\n",solve1(y,z,p)); 53 else if(k==2)solve2(y,z,p); 54 else solve3(y,z,p); 55 } 56 return 0; 57 }
奇奇怪怪的bsgs裸題。
不知道啥是bsgs的可以百度。
別名 拔山蓋世算法,百事公司算法等。
【bzoj2242】計算器