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;
}
posted @ 2026-10-30 14:52  Rainesxiao  阅读(3)  评论(0)    收藏  举报