1 条题解
-
0
#include <bits/stdc++.h> #define int long long using namespace std; const int MOD = 1000000000 + 7; const int MAXN = 1000000; // MAXM=MAXN int fact[MAXN + 5]; int factInv[MAXN + 5]; // (i!)^{-1} // n 个元素错位排列数 // n! * SUM{k=0~n}((-1)^k/k!) int d[MAXN + 5]; // a^b (mod p) long long quick_pow(long long a, long long b, long long p) { long long res = 1; while (b) { if (b & 1) res = (res * a) % p; b = b >> 1; a = (a * a) % p; } return res; } // 求 x 在模 p 意义下的逆元 int inv(int x, int p) { return quick_pow(x, p - 2, p); } // 计算fact、inv、d void init() { fact[0] = 1; for (int i = 1; i <= MAXN; i++) fact[i] = fact[i - 1] * i % MOD; for (int i = 0; i <= MAXN; i++) factInv[i] = inv(fact[i], MOD); d[0] = 1; d[1] = 0; for (int i = 2; i <= 1000000; i++) d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % MOD; } signed main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; init(); while (T--) { int n, m; cin >> n >> m; // 选m个位置固定 C(n,m) = n!/(m!(n-m)!) // 剩下的 n-m 个位置错排 d[n-m] int ans = 1; ans = (ans * fact[n]) % MOD; ans = (ans * factInv[m]) % MOD; ans = (ans * factInv[n - m]) % MOD; ans = (ans * d[n - m]) % MOD; cout << ans << "\n"; } return 0; }
- 1
信息
- ID
- 1275
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 17
- 已通过
- 12
- 上传者