求解 \(a^x\equiv b\pmod p\) 其中 p 不为质数情况的算法。
需要提前掌握 BSGS。
模板题:Luogu P4195。
思路
p 不为质数时,我们需要让 \(\gcd(a, p)=1\) 才能进行朴素 BSGS。
对于 \[ a^x\equiv b\pmod p \] 设 \(d=\gcd(a,p)\), \[ a^{x-1}\times a\equiv b \pmod p\\ a^{x-1}\times \frac{a}{d}\equiv \frac{b}{d} \pmod{\frac{p}{d}}\\ a^{x-1}\equiv \frac{\frac{b}{d}}{\frac{a}{d}}\pmod{\frac{p}{d}} \] 若 \(\gcd(a^{x-1},\frac{p}{d})\neq 1\),循环下去,直到 a,p 互质,进行朴素 BSGS 即可。
需要注意,若在过程中出现 \(d\not\mid b\) 即无解。
另外,如果循环第 k 次时 \[ a^{x-1}\equiv \frac{\frac{b}{d}}{\frac{a}{d}}\equiv 1\pmod{\frac{p}{d}} \] 此时 \(x-1=0\),最后答案为 k。
实现
直接做的话,要求 \(\frac{a}{d}\) 在模 \(\frac{p}{d}\) 意义下的逆元,\(\frac{p}{d}\) 不为质数,需要 exgcd 求逆元。
不写 exgcd 实现的话,设 \(c=\frac{a}{d}\),转化到 BSGS 中现在要求解 \(a^x\equiv \frac{b}{c}\pmod p\),将 c 乘到左边后做。
所以只要把 \(\frac{a}{d}\) 传入 BSGS 就行。
exBSGS code
1 | inline LL exBSGS(LL a, LL b, LL p) { |
luogu P4195 code
1 |
|