A - Character Encoding
题意:用m个$0-n-1$的数去构成k,求方案数
思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时的种类为C(k+m-1-i*n,m-1)个,利用容斥定理可得
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 const int MOD = 998244353; 8 const int maxn = 1e6 + 10; 9 10 ll fac[maxn]; 11 ll inv[maxn]; 12 ll invfac[maxn]; 13 14 void Init() 15 { 16 fac[0] = inv[0] = invfac[0] = 1; 17 fac[1] = inv[1] = invfac[1] = 1; 18 for(int i = 2; i < maxn; ++i) 19 { 20 fac[i] = fac[i - 1] * i % MOD; 21 inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; 22 invfac[i] = invfac[i - 1] * inv[i] % MOD; 23 } 24 } 25 26 ll calc(ll n, ll m) 27 { 28 if(m > n || m < 0 || n < 0) return 0; 29 return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD; 30 } 31 32 int n, m , k; 33 34 int main() 35 { 36 Init(); 37 int t; 38 scanf("%d", &t); 39 while(t--) 40 { 41 scanf("%d %d %d", &n, &m, &k); 42 ll ans = 0; 43 for(int i = 0; i <= m; ++i) 44 { 45 ll tmp = k - 1ll * i * n + m - 1; 46 if(tmp < 0) break; 47 if(i & 1) ans = (ans - calc(m, i) * calc(tmp, m - 1) % MOD + MOD) % MOD; 48 else ans = (ans + calc(m, i) * calc(tmp, m - 1) % MOD) % MOD; 49 // cout << i << " " << m << " " << calc(m, i); 50 // cout << tmp << " " << m - 1 << " " << calc(tmp, m - 1) << endl; 51 } 52 printf("%lld\n", ans); 53 } 54 return 0; 55 }