前几天在看 lucas 定理的时候发现要求 1, 2,⋯,p−1modp 1, 2,⋯,p−1modp 的逆元,然后就看到了一个 Θ(n) Θ(n) 的做法发现太神了,虽然想起来是挺简单的
这个做法实际上是这样的,首先 1−1≡1(modp) 1−1≡1(modp)
然后我们设 p=k⋅i+r, r<i, 1<i<p p=k⋅i+r, r<i, 1<i<p
再将这个式子放到 modp modp 意义下就会得到
k⋅i+r≡0(modp)
k⋅i+r≡0(modp)
两边同时乘上 i−1⋅r−1 i−1⋅r−1 就会得到
k⋅r−1+i−1i−1i−1≡≡≡0−k⋅r−1−⌊pi⌋⋅(pmodi)−1(modp)(modp)(modp)
k⋅r−1+i−1≡0(modp)i−1≡−k⋅r−1(modp)i−1≡−⌊pi⌋⋅(pmodi)−1(modp)
于是就可以从前面推出当前的逆元了,代码也就一行
1
|
A
[
i
]
=
-
(
p
/
i
)
*
A
[
p
%
i
]
;
|