1. 程式人生 > >【bzoj2242】計算器

【bzoj2242】計算器

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,int
z,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】計算器