引入
有很多题的答案可能会很大,这时候通常会让我们输出模一个数的结果。当我们的计算中只用到了加法,可以边加边模;只用到了乘法,可以边乘边模。但如果有除法,就不能边除边模了。这时候就要用到乘法逆元:a×inv(b)×inv(c)%mod=b×ca%mod。
有了乘法逆元,在过程中想怎么模就怎么模,非常方便。
计算
我们都知道,当模数为质数时,可以用快速幂求 amod−2,否则可以用扩展欧几里得来求。
在组合数中,我们经常会用到阶乘逆元。当我们算出了 1−n 的阶乘(%mod)后,就可以 O(n)算出每一个阶乘逆元:首先用上面两种方法之一算出 inv(n!),我们知道 inv(n!)=n!1%mod,那么 inv((n−1)!)=n!1×n%mod=inv(n)×n%mod,以此类推即可倒推出每一个数的阶乘逆元。
将其扩展为一般形式,就能得到线性求任意 n 个数的逆元:将这 n 个数求出前缀积,记为 s1−sn,求出 inv(sn),则 inv(sn−1)=inv(sn)×n,以此类推,求出每一个 inv(si),即可得出 inv(ai)=inv(si)×si−1。