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 }
View Code

相关文章: