1 条题解
-
0
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MOD = 1e9 + 7; const int MAXN = 1e6 + 5; ll fact[MAXN]; // 阶乘 ll inv_fact[MAXN]; // 阶乘逆元 ll D[MAXN]; // 错排数 ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } void init() { // 阶乘 fact[0] = 1; for (int i = 1; i < MAXN; i++) { fact[i] = fact[i - 1] * i % MOD; } // 阶乘逆元 inv_fact[MAXN - 1] = qpow(fact[MAXN - 1], MOD - 2); for (int i = MAXN - 2; i >= 0; i--) { inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD; } // 错排数 D[0] = 1; D[1] = 0; for (int i = 2; i < MAXN; i++) { D[i] = (i - 1) * (D[i - 1] + D[i - 2]) % MOD; } } ll C(int n, int m) { if (m < 0 || m > n) return 0; return fact[n] * inv_fact[m] % MOD * inv_fact[n - m] % MOD; } int main() { init(); int T; scanf("%d", &T); while (T--) { int n, m; scanf("%d%d", &n, &m); if (m > n) { printf("0\n"); continue; } ll ans = C(n, m) * D[n - m] % MOD; printf("%lld\n", ans); } return 0; }
信息
- ID
- 141
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 11
- 已通过
- 3
- 上传者