题面
bsgs模板。
大意是给三个数a,b,p,p是质数,求出x满足a^x=b(mod p)
变个形 设x=i*m-j
a^(i*m-j)=b(mod p)
a^(i*m)=b*a^j (mod p)
m为ceil(sqrt(p))
我们就先枚举j算出b*a^j,做一份hash表,用map存。
之后再枚举i,看表中是否有a^(i*m)。
j是0~m,i是1~m。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
using namespace std;
LL a,m,b,p,now;
map<LL,LL> mp;
inline LL fast_pow(LL a,LL b){
LL ret=1;
LL aa=a;
for(;b;b>>=1){
if(b&1) ret=(ret*aa)%p;
aa=aa*aa%p;
}
return ret;
}
int main(){
while(~scanf("%lld%lld%lld",&p,&a,&b)){
if(a%p==0){
puts("no solution");
continue;
}
mp.clear();
now=b%p;
bool flag=false;
mp[now]=0;
m=ceil(sqrt(p));
for(register int i=1;i<=m;i++){
now=(now*a)%p;
mp[now]=i;
}
now=1;
LL k=fast_pow(a,m);
for(register int i=1;i<=m;i++){
now=now*k%p;
if(mp[now]){
LL ans=i*m-mp[now];
printf("%lld\n",(ans%p+p)%p);
flag=true;
break;
}
}
if(!flag) puts("no solution");
}
return 0;
}