#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<cmath>
using namespace std;
typedef long long LL;
LL a,b,p;
LL qmi(LL a,LL k){
LL res=1;
while(k){
if(k&1)res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
unordered_map<LL,LL>m;
LL bsgs(){
a%=p,b%=p;
if(b==1)return 0;
LL n=ceil(sqrt(p));
for(int j=0;j<=n;j++){
m[b*qmi(a,j)%p]=j;
}
for(int i=1;i<=n;i++){
if(m[qmi(a,n*i)%p])return i*n-m[qmi(a,n*i)];
}
return -1;
}
int main(){
cin>>p>>a>>b;
m.clear();
LL ans=bsgs();
if(ans>=0)cout<<ans;
else cout<<"no solution";
return 0;
}
在枚举 b×aj 时, j 的范围应该是 [0,m−1] ,但是在这份代码中, j 必须枚举到m才行,为什么呢