Description
给定一个质数 (p),以及一个整数 (b),一个整数 (n),现在要求你计算一个最小的 (l),满足 (b^l equiv n pmod p)。
Solution
BSGS模板题
#include <bits/stdc++.h>
using namespace std;
#define int long long
int qpow(int p,int q,int mod) {return (q&1?p:1)*(q?qpow(p*p%mod,q/2,mod):1)%mod;}
// b^x=n mod p
int solve(int p,int b,int n) {
int m=ceil(sqrt(p)),i,t,temp,flag=0;
map<int,int> f;
for(t=1,i=0;i<m;t=t*b%p,i++) if(f.find(t)==f.end()) f[t]=i;
auto it=f.begin();
for(t=1,temp=qpow(b,p-m-1,p),i=0;i<m;t=t*temp%p,i++) {
it=f.find(n*t%p);
if(it!=f.end()) return i*m+it->second;
}
return -1;
}
signed main() {
int p,b,n;
cin>>p>>b>>n;
int tmp=solve(p,b,n);
if(tmp>=0) cout<<tmp;
else cout<<"no solution";
}