乘法逆元学习笔记

引入

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

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

计算

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

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

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

posted @ 2023-03-01 16:09  曹轩鸣  阅读(8)  评论(0编辑  收藏  举报