三行代码
inv[1] = 1;
for (int i = 2; i<MAXN; i++)
inv[i] = inv[MOD%i]*(MOD-MOD/i)%MOD;
简单证明一下可行性:
只需证明:
inv[i]∗i=1modMOD
i
n
v
[
i
]
∗
i
=
1
m
o
d
M
O
D
可证:
inv[MOD
i
n
v
[
M
O
D
%
i]∗(MOD−MOD/i)
i
]
∗
(
M
O
D
−
M
O
D
/
i
)
%
MOD∗i=1
M
O
D
∗
i
=
1
modMOD
m
o
d
M
O
D
设
MOD=i∗k+b;
M
O
D
=
i
∗
k
+
b
;
左边
左
边
=
(inv[MOD
(
i
n
v
[
M
O
D
%
i]∗(MOD
i
]
∗
(
M
O
D
%
i)(MOD∗i−MOD)
i
)
(
M
O
D
∗
i
−
M
O
D
)
%
MOD)
M
O
D
)
/
(MOD
(
M
O
D
%
i)
i
)
modMOD=(MOD−k)∗i
m
o
d
M
O
D
=
(
M
O
D
−
k
)
∗
i
mod MOD
=(MOD∗i+(b−MOD))
=
(
M
O
D
∗
i
+
(
b
−
M
O
D
)
)
mod MOD
=b/b
=
b
/
b
mod MOD
=1
=
1
mod MOD
得证