第一次写BSGS算法。
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
map<long long,int>mp;
long long a,b,c,m;
long long qsm(long long x){
long long sum=1,aa=a;
while(x>0){
if(x&1)sum=(sum*aa)%c;
x>>=1;
aa=(aa*aa)%c;
}
return sum;
}
int main(){
int i;
long long t,ans;
bool p;
while(scanf("%lld%lld%lld",&c,&a,&b)!=EOF){
mp.clear();
if(a%c==0){
printf("no solution\n");
continue;
}
int m=ceil(sqrt(c));
for(i=0;i<=m;i++){
if(i==0)ans=b%c;
else ans=(ans*a)%c;
mp[ans]=i;
}
t=qsm(m);
ans=1;
p=0;
for(i=1;i<=m;i++){
ans=(ans*t)%c;
if(mp[ans]){
printf("%d\n",((i*m-mp[ans])%c+c)%c);
p=1;
break;
}
}
if(p==0)
printf("no solution\n");
}
return 0;
}