BSGS
欧拉定理:\(a^{φ (p)}\equiv 1(mod \ p)\),由此可知 \(x \in [0,\varphi(p)]\rarr x\in[0,p]\)
因此我们可以考虑分块,令 \(x=im-j,m=\lceil \sqrt p \rceil ,i\in[1,m],j\in [0,m-1]\)
则有 \(a^{im}\equiv ba^{j}(mod \ p)\),先用一个哈希表存下 \(ba^j\) 的值,然后遍历 \(a^{im}\),复杂度 \(O(\sqrt p)\)
#include<bits/stdc++.h>
using namespace std;
#define int long long
unordered_map<int,int> h;
signed main(){
int a,b,p;cin>>p>>a>>b;
if(b==1){
cout<<0;
return 0;
}
int m=ceil(sqrt(p));
h[b]=0;int res=b;
for(int i=1;i<m;i++) res=res*a%p,h[res]=i;
res=1;
for(int i=1;i<=m;i++) res=res*a%p;
int res2=1;
for(int i=1;i<=m;i++){
res2=res2*res%p;
if(h.count(res2)){
cout<<i*m-h[res2];
return 0;
}
}
cout<<"no solution";
return 0;
}

浙公网安备 33010602011771号