……裸的ex_BSGS…………然后……
【关于ex_BSGS】:因为要用到逆元的存在,所以在gcd(a,p)!=1的时候,就不能BSGS了,这个时候除一除gcd还是很稳的……嗯……反正拆一个a出来当常数就好
感谢这个加强数据的大爷……让我调了一晚上【x @1430586275
当我看到这个↑ 的时候,心情是这样的:反正按照套路码完模板就完事了嘛……能加强到哪儿去
于是就这样了↓(两个1.3k的代码是粘的标程……嗯对其中一个被卡WA了
7*WA,1*T……
……然后我去spoj找到了原题……
啊……A了……????
…………【黑人问号
反正……要各种特判……
哦对了……我后面的几个WA是写错了GG
p==1 || p<=0 || b==1 || a==1 || p==1 || a==0 。。。。。
其实前面那个1386b的代码我也可以hack的【23333忽然想加强数据x
以上,
剩下的看代码了
#include<bits/stdc++.h>
using namespace std; long long a,p,b;
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
map<long long,int> mp;
long long BSGS(long long a,long long b,long long p){
if(p==0) return -1;
if(a==0) return b==0?1:-1;
a%=p,b%=p;
if(a==0) return b==0?0:-1;
if(b==1) return 0;
long long t=1;
long long cnt=0;
for(long long g=gcd(a,p);g!=1;g=gcd(a,p)){
if(b%g) return -1;
b/=g,p/=g,t=(t*a/g)%p;
++cnt;
if(b==t) return cnt;
}
//if(p==1) return cnt;
map<long long,int> mpp;
mpp.swap(mp);
int root_p=ceil(sqrt(p));
long long tmp=b,ttmp=1;
for(int i=0;i<root_p;++i,tmp=(tmp*a)%p,ttmp=(ttmp*a)%p) mp[tmp]=i;
tmp=(ttmp*t)%p;
for(int i=1;i<=root_p;++i,tmp=(tmp*ttmp)%p)
if(mp.count(tmp))
return 1ll*i*root_p-mp[tmp]+cnt;
return -1;
}
long long ans;
int main(){
while((~scanf("%lld%lld%lld",&a,&p,&b))&&(p|a|b)){
~(ans=BSGS(a,b,p))? printf("%lld\n",ans) : puts("No Solution");
}
return 0;
}