BSGS

普通 BSGS 用来求 \(a^x\equiv b\pmod p\) 的解,其中 \(p\) 是质数。

\(t=\lceil\sqrt p\rceil\),然后由 \((a,p)=1\),我们可以令 \(x=i\times t-j,(i\in[1,t],j\in[0,t-1])\)

于是 \((a^t)^i\equiv b\times a^j\pmod p\)

这样左右都是 \(t\) 个数了,然后只需 \(O(t)\) 先把所有 \(b\times a^j\) 插进 map,然后再 \(O(t)\) 查询 map 中有没有 \((a^t)^i\),时间复杂度 \(O(\sqrt p)\)

这样可以处理到 \((\lceil\sqrt p\rceil)^2\) 的数,又因为 \(a^p\equiv a\pmod p\),所以遍历了整个循环节,不会漏解。

code

点击查看代码
unordered_map<int,int>mp;
inline int bsgs(int a,int b,int p){
	mp.clear();
	int t=ceil(sqrt(p)),tp=1;
	for(int i=0;i<t;i++){
		if(tp==b)return i;
		if(!tp)return -1;
		mp[mul(b,tp)]=i,Mul(tp,a);
	}
	a=tp;
	for(int i=1;i<=t;i++,Mul(tp,a))
		if(mp.count(tp))return i*t-mp[tp];
	return -1;
}
posted @ 2022-02-17 17:14  llmmkk  阅读(66)  评论(0编辑  收藏  举报