思路:
容斥。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll MOD = 1e9 + 7; 5 const int MAXN = 200000; 6 ll f[MAXN + 5], inv[MAXN + 5]; 7 ll pow(ll a, ll b) 8 { 9 ll res = 1; 10 while (b) 11 { 12 if (b & 1) 13 res = res * a % MOD; 14 b >>= 1; 15 a = a * a % MOD; 16 } 17 return res; 18 } 19 20 void init() 21 { 22 f[0] = 1; 23 for (int i = 1; i <= MAXN; i++) f[i] = f[i - 1] * i % MOD; 24 inv[MAXN] = pow(f[MAXN], MOD - 2); 25 for (int i = MAXN - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % MOD; 26 } 27 28 ll C(int a, int b) 29 { 30 return f[a] * inv[b] % MOD * inv[a - b] % MOD; 31 } 32 33 int main() 34 { 35 init(); 36 int T, n, m; 37 cin >> T; 38 for (int i = 1; i <= T; i++) 39 { 40 cin >> n >> m; 41 ll ans = 0, s = 1, bin = 1; 42 for (int i = 0; i <= m; i++) 43 { 44 ans = (ans + s * C(m, i) * bin % MOD * f[2 * n - i] % MOD) % MOD; 45 s *= -1; 46 bin = bin * 2 % MOD; 47 } 48 cout << "Case #" << i << ": " << (ans + MOD) % MOD << endl; 49 } 50 return 0; 51 }