这里的 factinv 即为阶乘逆元。
#include <cstdio> const int maxn = 3000005; int n, p; int inv[maxn], factinv[maxn]; int main() { scanf("%d%d", &n, &p); factinv[1] = inv[1] = 1; printf("%d\n", 1); for (int i = 2; i <= n; ++i) { inv[i] = 1ll * (p - p / i) * inv[p % i] % p; printf("%d\n", inv[i]); factinv[i] = 1ll * factinv[i - 1] * inv[i] % p; } return 0; }

