64分求助,还要特判什么呀
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,p,y,z;
unordered_map<int,int>hsh;
int ksm(int a,int b,int p){
int sum=1;
while(b){
if(b&1) sum=sum*a%p;
a=a*a%p;
b>>=1;
}
return sum;
}
int BSGS(int a,int b,int p){
int m=sqrt(p)+1;
b%=p;
for(int i=0;i<m;i++){
int fp=ksm(a,i,p);
hsh[b*fp%p]=i;
}
a=ksm(a,m,p);
for(int i=1;i<=m;i++){
int fp=ksm(a,i,p);
if(hsh.count(fp)>0){
if(i*m-hsh[fp]){
return i*m-hsh[fp];
}
}
}
return -1;
}
long long exgcd(long long a,long long b,long long &x1,long long &y2){
if(b==0){
x1=1,y2=0;
return a;
}
long long d=exgcd(b,a%b,x1,y2);
long long z=x1;x1=y2;y2=z-y2*(a/b);
return d;
}
signed main(){
int t,op;
cin>>t>>op;
while(t--){
int p,a,b;
cin>>a>>b>>p;
if(op==1){
cout<<ksm(a,b,p)<<endl;
}
if(op==2){
long long x=0,yy=0,gcd=0;
gcd=exgcd(a,p,x,yy);
if(b%gcd==0){
long long tmp=p/gcd;
x=(((x*b)/gcd)%tmp+tmp)%tmp;
printf("%lld\n",x);
}
else{
printf("Orz, I cannot find x!\n");
}
}
if(op==3){
if(y%p==0&&b%p!=0){
cout<<"Orz, I cannot find x!"<<endl;
}
if(BSGS(a,b,p)==-1){
cout<<"Orz, I cannot find x!"<<endl;
}
else{
cout<<BSGS(a,b,p)<<endl;
}
}
}
return 0;
}