求解满足 ax≡b(modp) 的最小 x ( p 是质数)
分块?设分块大小为 t
考虑 i∈[0,⌈tn⌉],j∈[1,t] 则 ax 可以表示成 ait−j
ait−j≡b(modp)
转换一下
ait≡baj(modp)
预处理出所有的 baj 存到一个 map
/ unordered_map
中,在枚举 i in range[1, n/t]
判断 ait 是否和某个元素 baj 相等,答案即为 it−j
复杂度 O(t+⌈tn⌉) ,当 t 取 n 时 复杂度 O(n)
exBSGS
求解满足 ax≡b(modp) 的最小 x (a 与 p 可能不互质)
想办法使 a⊥p
设 d1=gcd(a,p) ,若 d1∤b 则原方程无解(裴蜀定理),否则方程变为d1a⋅ax−1≡d1b(modd1p)
一直除,直到 a⊥d1d2d3...dkp 。
记 D=i=1∏kdi
Dak⋅ax−k≡Db(modDp)
即
ax−k≡Db⋅(Dak)−1(modDp)
用 BSGS 求就是了(记得答案加上 k)
不排除答案小于 k ,所以在构造 a⊥p 时记得判断一下当前的 i=1∏k′di 是否等于当前的 b/i=1∏k′di ,相等的话答案就是 k′