ikatakos
11/5/2018 - 1:41 PM

Modular Multiplicative Inverse of Factorial - Nim

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)