乘法逆元
为什么要写这么简单的东西呢?因为我不知道 $2$ 的逆元可以直接 $\dfrac{p+1}{2}$,被 /cf 了。而且发现我确实有点忘记了。
乘法逆元是解决模意义下除法问题的工具。
定义:$ax \equiv 1 \pmod{p} $,则 $x$ 为 $a$ 在模 $P$ 意义下的乘法逆元,记作 $a^{-1}$。定义很自然,我们平时除法不就是 $\dfrac{a}{a}=1$,现在只不过找了一个替代的数而已。注意本文代码没有取模,实际问题请实际考虑。
基础求逆元
- 费马小定理求逆元
- exgcd 求逆元
- 线性求逆元
- 求任意数列逆元
费马小定理法(要求模数为素数)
由 $a^{p-1}\equiv 1\pmod{p}$ 可得 $a\times a^{p-2}\equiv 1\pmod{p}$,观察可得 $a^{-1}=a^{p-2}$。
扩展欧几里得法(要求 $\gcd(a,p)=1$)
求解同余方程,其中 $a,p$ 已知。
原式转化为 $ax+py=1$,求出 $x$ 的最小正整数解即可。
线性求逆元
在 $\mathcal{O}(n)$ 的时间复杂度内求出 $1$ 到 $n$ 的逆元,显然 inv[1]=1。
考虑计算 $i^{-1}$,令 $x=\left \lfloor \dfrac{p}{i} \right \rfloor,y=p\bmod i$,则有 $ix+y=p$。
$ix+y\equiv 0 \pmod{p}$,等式乘上 $i^{-1}\times y^{-1}$,得 $xy^{-1}+i^{-1}\equiv 0 \pmod{p}$,移项,得 $i^{-1}\equiv p-xy^{-1} \pmod{p}$。
因为 $y^{-1}$ 一定在 $i^{-1}$ 之前被计算,所以可以看做已知。
inv[1] = 1;
for(int i=2;i<=n;i++){
inv[i]=(p-p/i)*inv[p%i]%p;
}
这也可以解释为什么 $2$ 的逆元就是 $\dfrac{p+1}{2}$。
一个 corner case:在线性求逆元中,可能有数字并不存在逆元,也就是不满足和 $p$ 互质,这种情况是未定义的,但是在 $p$ 为足够大的质数时可忽略不计。
求任意数列逆元
对于长为 $n$ 的序列 $a$,求 $a_i^{-1}$。
做一个前缀积,记为 $m_i$,求出 $m_n$ 的逆元记为 $x$。那么我们就知道了所有数字积的逆元,也就是逆元的积。考虑倒序往前乘上 $a_i$ 相当于是抵消 $a_i^{-1}$。这样我们就得到了一个前缀逆元记为 $s_i$。
现在考虑求出 $a_i^{-1}$,答案即为 $m_{i-1}s_i$,也就是在前缀逆元中抵消了前面所有数字的贡献。
n = rd(); m[0] = 1;
for(int i=1;i<=n;i++){
a[i] = rd();
m[i] = m[i-1] * a[i] % p;
}
int x = qpow(m[n],mod-2);
for(int i=n;i>=1;i--){
s[i] = x;
x = x * a[i] % p;
}
for(int i=1;i<=n;i++){
inv[i] = s[i] * m[i-1] % p;
}
等等,我一开始想说啥来着?我记得有什么拓展,但是我似乎忘了,那就作为一篇入门教程放着吧。

浙公网安备 33010602011771号