首页 > 代码库 > 【bzoj2242】计算器

【bzoj2242】计算器

 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】计算器