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;
}