乘法逆元学习笔记

引入

有很多题的答案可能会很大,这时候通常会让我们输出模一个数的结果。当我们的计算中只用到了加法,可以边加边模;只用到了乘法,可以边乘边模。但如果有除法,就不能边除边模了。这时候就要用到乘法逆元:a×inv(b)×inv(c)%mod=ab×c%moda\times inv(b)\times inv(c)\%mod=\frac{a}{b\times c}\%mod

有了乘法逆元,在过程中想怎么模就怎么模,非常方便。

计算

我们都知道,当模数为质数时,可以用快速幂求 amod2a^{mod-2},否则可以用扩展欧几里得来求。

在组合数中,我们经常会用到阶乘逆元。当我们算出了 1n1-n 的阶乘(%mod\%mod)后,就可以 O(n)O(n)算出每一个阶乘逆元:首先用上面两种方法之一算出 inv(n!)inv(n!),我们知道 inv(n!)=1n!%modinv(n!)=\frac{1}{n!}\%mod,那么 inv((n1)!)=1n!×n%mod=inv(n)×n%modinv((n-1)!)=\frac{1}{n!}\times n\%mod=inv(n)\times n\%mod,以此类推即可倒推出每一个数的阶乘逆元。

将其扩展为一般形式,就能得到线性求任意 nn 个数的逆元:将这 nn 个数求出前缀积,记为 s1sns_1-s_n,求出 inv(sn)inv(s_n),则 inv(sn1)=inv(sn)×ninv(s_{n-1})=inv(s_n)\times n,以此类推,求出每一个 inv(si)inv(s_i),即可得出 inv(ai)=inv(si)×si1inv(a_i)=inv(s_i)\times s_{i-1}