#include<cstdio>
#include<map>
#define int long long
using namespace std;
inline int sqrt(int sqrtner){
if(sqrtner<4){
return 1;
};
int low=0,high=sqrtner;
while(low<high){
int middle=(low+high+1)>>1;
if(middle*middle>sqrtner){
high=middle-1;
}else{
low=middle;
};
};
if(low*low>sqrtner){
return high;
};
return low;
};
inline int power(int first,int second,int mod){
int result=1;
while(second){
if(second&1){
(result*=first)%=mod;
};
second>>=1;
(first*=first)%=mod;
};
return (result%mod+mod)%mod;
};
inline int exgcd(int gcdarg1,int gcdarg2,int &answer1,int &answer2){
if(gcdarg2==0){
answer1=1;
answer2=0;
return gcdarg1;
};
int result=exgcd(gcdarg2,gcdarg1%gcdarg2,answer1,answer2);
int answer=answer1;
answer1=answer2;
answer2=answer-(gcdarg1/gcdarg2)*answer1;
return result;
};
inline int baby_giant_step(int first,int second,int mod){
map<int,int> hash;
int cur=1,sqrtner=sqrt(mod)+1;
for(int iter=1;iter<=sqrtner;++iter){
(cur*=first)%=mod;
hash[second*cur%mod]=iter;
};
int now=cur;
for(int iter=1;iter<=sqrtner;++iter){
if(hash[now]){
return iter*sqrtner-hash[now];
};
(now*=cur)%=mod;
};
return -1;
};
signed main(signed,char**){
int test,type;
scanf("%lld %lld",&test,&type);
while(test--){
int first,second,third;
scanf("%lld %lld %lld",&first,&second,&third);
if(type==1){
printf("%lld\n",power(first,second,third));
}else if(type==2){
int answer1,answer2;
int result=exgcd(first,third,answer1,answer2);
if(second%result==0){
int tmp=third/result;
answer1=(((answer1*second)/result)%tmp+tmp)%tmp;
printf("%lld\n",answer1);
}else{
puts("Orz, I cannot find x!");
};
}else{
int answer=baby_giant_step(first,second,third);
if(answer==-1||answer==0||answer==1){
puts("Orz, I cannot find x!");
}else{
printf("%lld\n",answer);
};
};
};
return 0;
};
在第 21 个点 WA 了。
Input:
1 3
1000003 2000006 1000003
Output:
Orz, I cannot find x!
Answer:
1