前置芝士:
1.快速幂(用于求一个数的幂次方)
2.STL里的map(快速查找)
详解
BSGS 算法适用于解决高次同余方程 \(a^x\equiv b (mod p)\)
由费马小定理可得 x <= p-1
我们设 \(m = sqrt(p)\) 至于为什么写,下文会讲到。
那么\(x\)就可以用 \(m\) 表示出来。
即 x = \(k \times m - j\)
移项可得 \(a^t \equiv b\times a^j\) 其中 t = \(k \times m\)
这也就是我们为什么把\(x\)用 \(k \times m - j\)来表示。
因为改为加\(j\)后,移项后要求逆元,就会变得很麻烦。
这样,我们就可以枚举每个\(k\)和\(j\),来判断左右两边得值是否相等就行了。
首先,我们可以枚举j 将 \(b\times a^j\)放入map中。
然后,从小到大枚举\(k\),在哈希表中,找到最大的\(j\)满足 \(a^t \equiv b\times a^j\) 其中 t = \(k \times m\)
若存在\(k\times m -j\)就是方程的解
关于上文中,为什么要设\(m = sqrt(p)\)
是为了保证BSGS的复杂度,是左右两边的数尽可能的均匀。
例题
P3846 [TJOI2007] 可爱的质数
模板题,水过去了
#include
#include
#include
#include
P2485 [SDOI2011]计算器
一道很多算法综合在一起的模板题,水过去了。
#include
#include
#include
#include
#include
ENDING