[TJOI2007] 可爱的质数
题意
求最小的\(x\)满足\(a^x \equiv b\mod p\)
想法
这个是标准的板子题,\(BSGS\)算法可以用来解决\(a^x \equiv b\mod p\) 和 \(x^a \equiv b\mod p\)问题
本题是前者
我们考虑这样 \(a^{A * \sqrt p - B} \equiv b\mod 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");
}