线性预处理逆元

#include <cstdio>

const int MAXN = 3000005;

int fact[MAXN], invFact[MAXN], inv[MAXN];

void exgcd(int a, int b, int &x, int &y) {
    if (b == 0) x = 1, y = 0;
    else exgcd(b, a % b, y, x), y -= x * (a / b);
}

int getInv(int x, int mod) {
    int res, temp;
    exgcd(x, mod, res, temp);
    return res;
}

int main() {
    int n, p;
    scanf("%d %d", &n, &p);

    inv[1] = 1;
    for (int i = 2; i <= n; i++) inv[i] = (long long) (p - p / i) * inv[p % i] % p;

    fact[0] = 1;
    for (int i = 1; i <= n; i++) fact[i] = (long long) fact[i - 1] * i % p;
    invFact[n] = getInv(fact[n], p);
    for (int i = n - 1; i; i--) invFact[i] = (long long) invFact[i + 1] * (i + 1)% p;

    return 0;
}

results matching ""

    No results matching ""