题目描述
题解
BSGS算法。
这里P为质数,所以只需要判断B是否能整除P即可。
注意一下map的用法。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
#define LL long long
map <LL,LL> hash;
LL P,B,N,m,B_m,mul,now,ans;
bool pd;
inline void clear(){
pd=false;
hash.clear();
}
inline LL fast_pow(LL a,LL p){
LL ans=1;
for (;p;p>>=1,a=(LL)(a*a)%P)
if (p&1)
ans=ans*a%P;
return ans;
}
int main(){
while (~scanf("%lld%lld%lld",&P,&B,&N)){
if (B%P==0){
printf("no solution\n");
continue;
}
clear();
m=ceil(sqrt(P));
B_m=fast_pow(B,m);
mul=1;
now=mul*N%P;
hash[now]=0;
for (int j=1;j<=m;++j){
mul=mul*B%P;
now=mul*N%P;
hash[now]=j;
}
mul=1;
for (int i=1;i<=m;++i){
mul=mul*B_m%P;
if (hash[mul]){
pd=true;
ans=i*m-hash[mul];
printf("%lld\n",ans);
break;
}
}
if (!pd) printf("no solution\n");
}
}
总结
①遇到不明白的地方不要张口就问别人,自己思考过后还是不懂再去问(很重要!!!)
②这里的映射数组存hash表的方法要注意了,可以解决空间不足的情况。
③注意爆int的情况,最近经常出现这样的问题。