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_mapmp;
inline int bsgs(int a,int b,int p){
	mp.clear();
	int t=ceil(sqrt(p)),tp=1;
	for(int i=0;i