1~Nの階乗とその逆数
const MOD = 1_000_000_007
proc `*%`(x, y: int): int =
x * y mod MOD
proc `*%=`(x: var int, y: int): void =
x = x *% y
proc powmod(x, a: int): int =
var
ans = 1
b = a
y = x
while b > 0:
if (b and 1) == 1:
ans *%= y
y *%= y
b = b shr 1
return ans
proc prepare(n: int): (seq[int], seq[int]) =
var
f = 1
factorials = @[1]
for m in 1..n:
f *%= m
factorials.add(f)
var
inv = powmod(f, MOD - 2)
invs = newSeq[int](n + 1)
invs[n] = inv
invs[0] = 1
for m in countdown(n, 2):
inv *%= m
invs[m - 1] = inv
return (factorials, invs)