0%

线性求逆元

当要求 1n1-n 中所有数的逆元时,O(nlogp)O(n\log p) 的方法就有点悬了。

下面介绍一种 O(n)O(n) 求逆元的好方法。

推导

首先,111(modp)1^{-1}\equiv1\pmod p

k=pik=\lfloor\frac pi\rfloor,则 p=ki+rp=k\cdot i+r,其中 r=pmodi,1<i<pr=p\bmod i,1<i<p

易得 ki+r0(modp)k\cdot i+r\equiv0\pmod p

两边同乘 i1r1i^{-1}\cdot r^{-1} 得:

kr1+i10(modp)i1kr1(modp)i1pi(pmodi)1(modp)\begin{aligned} k\cdot r^{-1}+i^{-1}&\equiv0&\pmod p\\ i^{-1}&\equiv-k\cdot r^{-1}&\pmod p\\ i^{-1}&\equiv-\lfloor\frac pi\rfloor\cdot(p\bmod i)^{-1}&\pmod p \end{aligned}

代码

1
2
3
for(int i=1;i<=N;++i) {
inv[i]=-(mod/i)*inv[mod%i]%mod;
}

为使 inviinv_i 非负,代码也可写成:

1
2
3
for(int i=1;i<=N;++i) {
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}