组合八题
把球放进盒子里,求方案数。
| 编号 | 球是否相同 | 盒子是否相同 | 盒子是否为空 |
|---|---|---|---|
| A | 0 | 0 | 0 |
| B | 0 | 0 | 1 |
| C | 0 | 1 | 0 |
| D | 0 | 1 | 1 |
| E | 1 | 0 | 0 |
| F | 1 | 0 | 1 |
| G | 1 | 1 | 0 |
| H | 1 | 1 | 1 |
求组合数
原理 \(C_n^m = \frac{n!}{m!(n-m)!}\)。
namespace C{
long long ny[N], jc[N];
void init(){
ny[0] = ny[1] = jc[0] = jc[1] = 1;
for(int i = 2; i < N; i++)
ny[i] = (MOD - MOD / i) * ny[MOD % i] % MOD;
for(int i = 2; i < N; i++)
jc[i] = i * jc[i - 1] % MOD, ny[i] = ny[i] * ny[i - 1] % MOD;
}
long long C(int x, int y){
if(x > y)
return 0;
return jc[y] * ny[x] % MOD * ny[y - x] % MOD;
}
}
#include<iostream>
#include<cstring>
using namespace std;
const int N1 = 5005, N2 = 2e5 + 10, MOD = 998244353;
int n, m, f[N1][N1], ny[N2], jc[N2], s[N1][N1];
int C(int x, int y){
if(x > y)
return 0;
return 1ll * jc[y] * ny[x] % MOD * ny[y - x] % MOD;
}
int qpow(long long x, int k){
long long ans = 1;
while(k){
if(k & 1)
ans = ans * x % MOD;
x = x * x % MOD, k >>= 1;
}
return ans;
}
int main(){
fill(f[0], f[0] + 5003, 1);
s[0][0] = 1;
for(int i = 1; i <= 5000; i++){
for(int j = 1; j <= 5000; j++){
f[i][j] = (f[i][j - 1] + ((i >= j)? f[i - j][j] : 0)) % MOD;
s[i][j] = (1ll * j * s[i - 1][j] + s[i - 1][j - 1]) % MOD;
}
}
ny[0] = ny[1] = jc[0] = jc[1] = 1;
for(int i = 2; i <= 2e5; i++)
ny[i] = 1ll * (MOD - MOD / i) * ny[MOD % i] % MOD;
for(int i = 2; i <= 2e5; i++)
jc[i] = 1ll * i * jc[i - 1] % MOD, ny[i] = 1ll * ny[i] * ny[i - 1] % MOD;
cin >> n >> m;
if(n < m)
cout << "0\n";
else
cout << f[n - m][m] << "\n";
cin >> n >> m;
cout << f[n][m] << "\n";
cin >> n >> m;
cout << C(m - 1, n - 1) << "\n";
cin >> n >> m;
cout << C(m - 1, n + m - 1) << "\n";
cin >> n >> m;
int ans = 0;
for(long long i = 0, t = 1; i <= m; i++, t *= -1)
ans = (ans + t * C(i, m) * qpow(m - i, n) % MOD + MOD) % MOD;
cout << 1ll * ans * ny[m] % MOD << "\n";
cin >> n >> m;
ans = 0;
for(int i = 1; i <= m; i++)
ans = (ans + s[n][i]) % MOD;
cout << ans << "\n";
cin >> n >> m;
ans = 0;
for(long long i = 0, t = 1; i <= m; i++, t *= -1)
ans = (ans + t * C(i, m) * qpow(m - i, n) % MOD + MOD) % MOD;
cout << ans << "\n";
cin >> n >> m;
cout << qpow(m, n) << "\n";
return 0;
}

浙公网安备 33010602011771号