题解:P3846 [TJOI2007] 可爱的质数/【模板】BSGS
算法介绍
BSGS 算法用于求解离散对数问题,即:对于已知的三个数
首先由费马小定理,
定义
设
先从小到大枚举
正确性证明
设我们已经找到了一组
这也是普通 BSGS 要求
枚举
代码实现
这应该是非常短的一种实现了。有些人可能会写一个快速幂的函数,但是实际上没有必要,暴力计算
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<ll, ll> mp;
ll p,b,n,s;
int main() {
cin>>p>>b>>n, s=sqrt(p)+1;
for(ll y=1, pw=n*b%p; y<=s; y++, pw=pw*b%p) mp[pw%p]=y;
ll t=1;
for(ll i=1; i<=s; i++) t=t*b%p;
for(ll x=1, pw=t; x<=s; x++, pw=pw*t%p)
if(mp[pw])
return cout<<x*s-mp[pw], 0;
cout<<"no solution";
return 0;
}