P3846 [TJOI2007] 可爱的质数/【模板】BSGS
\(BSGS(Baby\ Steps\ Giant\ Steps)\)
对于 \(a^x\equiv b\pmod{p}\) ,求\(x_{min}\)
由于模的剩余类会产生循环节,根据鸽巢原理,
\(a^0, a^1, \ldots, a^{n-1}\)模\(p\)(\(p\)为质数)意义下的剩余类与\(a^n, a^{n+1}, \ldots, a^{2n-1}\)的剩余类相同,
因此我们要的答案一定在\([0, n-1]\)内。
把这\(n\)个数分块, 设\(m=\lceil\sqrt{p}\rceil\)(向上取整)。
设\(x=i*m-y\),
\(a^{i*m-y}\equiv b\pmod{p}\)
\(a^{i*m}\equiv b\times a^y\pmod{p}\)$
检查 \(a^y\)是否在出现过,可以用\(map\)或哈希表记录。
首先求出\(a^1,a^2, \ldots, a^m\),并记录\(hash[b\times a^i]=i\)
枚举每个块的端点\(now = now \times a^m\)
若找到了\(hash[now]\),则答案即为\(i*m-hash[now]\)。
时间复杂度为\(O(\sqrt p)\)