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\),因此 \(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是为了防止出现负数引起奇怪错误
}