题意
求最小的(x)满足(a^x equiv bmod p)
想法
这个是标准的板子题,(BSGS)算法可以用来解决(a^x equiv bmod p) 和 (x^a equiv bmod p)问题
本题是前者
我们考虑这样 (a^{A * sqrt p - B} equiv bmod p)
有
(a^{A * sqrt p} equiv ba^{B}mod p)
其中((A,B < sqrt p))
我们先枚举(B)统计出(ba^B)的答案用(hash 或者 map)给存下来
再枚举(A)统计答案即可
代码(与想法里的字符不同)
#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
#define ll long long
using std::map;
ll a,b,p;
ll A,B,minn = 0x3f3f3f3f;
map<ll,ll>QWQ;
ll ans[1000],cnt;
int main(){
scanf("%lld%lld%lld",&p,&a,&b);//5 2 3 2 ^ x == 3 (mod 5)
ll s = ceil(sqrt(p));
if(a % p == 0){
puts("no solution");
return 0;
}
QWQ[s] = 0;
B = b,A = 1;
for(int i = 1;i <= s;++i){
B = (B * a) % p;
A = (A * a) % p;
QWQ[B] = i;
}
ll now = 1;
for(int i = 1;i <= s;++i){
now = (now * A) % p;
if(QWQ[now]){
std::cout<<(i * s - QWQ[now] + 2 * p) % p<<std::endl;
return 0;
}
}
puts("no solution");
}