线性预处理逆元
#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;
}