求解满足 ax≡b(modp)a^x\equiv b\pmod p 的最小 xx ( pp 是质数)

分块?设分块大小为 tt

考虑 i∈[0,⌈nt⌉],j∈[1,t]i\in[0,\left\lceil\dfrac{n}{t}\right\rceil],j\in[1,t] 则 axa^x 可以表示成 ait−ja^{it-j}

ait−j≡b(modp)a^{it-j}\equiv b\pmod p

转换一下

ait≡baj(modp)a^{it}\equiv ba^j\pmod p

预处理出所有的 bajba^j 存到一个 map / unordered_map 中,在枚举 i in range[1, n/t] 判断 aita^{it} 是否和某个元素 bajba^j 相等,答案即为 it−jit-j

复杂度 O(t+⌈nt⌉)O(t+\left\lceil\dfrac{n}{t}\right\rceil) ,当 tt 取 n\sqrt{n} 时 复杂度 O(n)O(\sqrt n)


exBSGS

求解满足 ax≡b(modp)a^x\equiv b\pmod p 的最小 xx (aa 与 pp 可能不互质)

想办法使 a⊥pa\perp p

设 d1=gcd⁡(a,p)d_1=\gcd(a,p) ,若 d1∤bd_1\nmid b 则原方程无解(裴蜀定理),否则方程变为ad1⋅ax−1≡bd1(modpd1)\dfrac{a}{d_1}\cdot a^{x-1}\equiv\dfrac{b}{d_1}\pmod {\dfrac{p}{d_1}}

一直除,直到 a⊥pd1d2d3...dka\perp \frac{p}{d_1d_2d_3...d_k} 。

记 D=∏i=1kdiD=\prod\limits_{i=1}^kd_i

akD⋅ax−k≡bD(modpD)\dfrac{a^k}{D}\cdot a^{x-k}\equiv \dfrac bD\pmod{\dfrac pD}

即

ax−k≡bD⋅(akD)−1(modpD)a^{x-k}\equiv \dfrac bD\cdot \left(\dfrac{a^k}{D}\right)^{-1}\pmod{\dfrac pD}

用 BSGS 求就是了(记得答案加上 kk)

不排除答案小于 kk ,所以在构造 a⊥pa\perp p 时记得判断一下当前的 ∏i=1k′di\prod\limits_{i=1}^{k'}d_i 是否等于当前的 b/∏i=1k′dib /\prod\limits_{i=1}^{k'}d_i ,相等的话答案就是 k′k'