P3811 线性乘法逆元


求一连串数的乘法逆元

\[ax \equiv1(mod\;p) \]

由同余方程定义得\(a\times a^{-1}\equiv1(mod\; p)\),
那么\(a \times a^{-1}=Kp+1\)

如果有

\[S\equiv0(mod\;p) \]

那么左边乘上一个\(i^{-1}\)

\[S\times i\times i^{-1}\equiv S\times(Kp+1) \equiv SKp+S\equiv S \equiv0(mod\;p) \]

\(p=ki+r\)

显然有\(ki+r\equiv0(mod\;p)\) \(\;,k=[\frac{p}{i}]\;\),\(r=p\;mod\;i\)

左边乘上一个\(i^{-1}r^{-1}\)

\[(ki+r)\times i^{-1}r^{-1} \equiv kr^{-1}+i^{-1}\equiv0(mod\;p) \]

\[i^{-1}\equiv-k\times r^{-1}\equiv-[\frac{p}{i}]\times(p\;mod \;i)^{-1} \]

由于输入保证\(p\)是质数,\(n,因此 \(p\;mod\;i \not ={0}\)

由此,我们可以打出如下代码

f[0]=1;
for(int i=2;i<=n;i++)
{
    f[i]=(-p/i+p)*f[p%i]%p;//(-p/i)里之所以要加p是为了防止出现负数引起奇怪错误
}