def multiple_mod_inv(nums, mod):
a = list(nums)
b = [v := 1] + [v := v * x % mod for x in reversed(a)]
b_inv = pow(b.pop(), -1, mod)
return [b_inv * b.pop() % mod] + [
(b_inv := b_inv * a_ % mod) * b_ % mod for a_, b_ in zip(a, reversed(b))
]
def factorial_mod_inv(n, mod):
"""Returns mod inverses of factorials, [inv(0!), inv(1!), .., inv(n!)]."""
fact = 1
for i in range(1, n + 1):
fact = fact * i % mod
v = pow(fact, -1, mod)
finv = [v] + [v := v * i % mod for i in range(n, 0, -1)]
return finv[::-1]
inv = [None, 1]
for i in range(2, n):
inv.append(-(MOD // i) * inv[MOD % i])