同步发表于 P4195 题解。
0. 前置知识 & 废话
逆元。
1. 普通版 BSGS
要求 $\gcd(a,p)=1$。
其实就是一个分块的思想。
设 $t=\lceil\sqrt p\rceil$,我们可以将每一个答案 $x=i\times t-m$,其中 $i,m\leq t$。
$a^{i\cdot t-m}=b\pmod p\Leftrightarrow a^{i\cdot t}=b\times a^{m}\pmod p$。
我们枚举每一个 $i$,怎么找到右边的呢?
其实,我们可以先将 $b\times a^m$ 全部用 Hash 存下来。
这样就可以直接查找了。
2. 扩展版 BSGS
想办法解决问题,我们应该实现 $\gcd(a,p)=1$。
首先,同余具有一条性质:
可以感性的理解一下 (主要是不会证)。
那么,我们就可以执行消除因子。
每次在两边除以 $d=\gcd(a,p)$。
重复执行该语段,直到 $\gcd(a,p)=1$ 为止。
将所有的 $\dfrac{a}{d}$ 都乘起来,记为 $tot$。
假设执行了 $cnt$ 次,则原问题转化为 $tot\times a^{x-cnt}=b\pmod p\Leftrightarrow a^{x-cnt}=b\times tot^{-1}\pmod p$
注意,这里有一些细节:
- 如果 $b$ 不被 $d$ 整除,则直接返回无解。
- 答案可能小于 $cnt$,我们必须枚举 $[0,cnt-1]$ 的解,看有没有。
于是就转化为了普通的 BSGS 了。
1 | using LL = long long; |