这是一个黑科技。
可以将某些题目硬生生地压到O(N)
不过这求的是1~n的逆元,多了不行……
结论
接下来放式子:
inv[i]=(M-M/i)*inv[M%i]%M;
用数学方法来表示:
i
−
1
=
(
M
−
⌊
M
i
⌋
)
(
M
m
o
d
  
i
)
−
1
m
o
d
  
M
i^{-1}=\left(M-\lfloor\frac{M}{i}\rfloor\right)\left(M\mod i\right)^{-1}\mod M
i−1=(M−⌊iM⌋)(Mmodi)−1modM
证明
设
k
=
⌊
M
i
⌋
k=\lfloor\frac{M}{i}\rfloor
k=⌊iM⌋,
r
=
M
m
o
d
  
i
r=M \mod i
r=Mmodi
∴
i
k
+
r
≡
0
(
m
o
d
  
M
)
∴
−
i
k
≡
r
(
m
o
d
  
M
)
\therefore ik+r \equiv 0 \left(\mod M\right) \\ \therefore -ik \equiv r \left(\mod M\right)
∴ik+r≡0(modM)∴−ik≡r(modM)
两边同时除以
i
r
ir
ir得
−
k
∗
r
−
1
≡
i
i
−
1
(
m
o
d
  
M
)
∴
i
i
−
1
=
−
k
∗
r
−
1
m
o
d
  
M
-k*r^{-1} \equiv i^{i-1} \left(\mod M\right) \\ \therefore i^{i-1}=-k*r^{-1} \mod M
−k∗r−1≡ii−1(modM)∴ii−1=−k∗r−1modM
即
i
−
1
=
(
M
−
⌊
M
i
⌋
)
(
M
m
o
d
  
i
)
−
1
m
o
d
  
M
i^{-1}=\left(M-\lfloor\frac{M}{i}\rfloor\right)\left(M\mod i\right)^{-1}\mod M
i−1=(M−⌊iM⌋)(Mmodi)−1modM