当要求 1−n 中所有数的逆元时,O(nlogp) 的方法就有点悬了。
下面介绍一种 O(n) 求逆元的好方法。
推导
首先,1−1≡1(modp)。
设 k=⌊ip⌋,则 p=k⋅i+r,其中 r=pmodi,1<i<p。
易得 k⋅i+r≡0(modp)。
两边同乘 i−1⋅r−1 得:
k⋅r−1+i−1i−1i−1≡0≡−k⋅r−1≡−⌊ip⌋⋅(pmodi)−1(modp)(modp)(modp)
代码
1 2 3
| for(int i=1;i<=N;++i) { inv[i]=-(mod/i)*inv[mod%i]%mod; }
|
为使 invi 非负,代码也可写成:
1 2 3
| for(int i=1;i<=N;++i) { inv[i]=(mod-mod/i)*inv[mod%i]%mod; }
|