组合八题

组合八题

把球放进盒子里,求方案数。

编号 球是否相同 盒子是否相同 盒子是否为空
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;
}
posted @ 2024-03-18 21:09  louisliang  阅读(14)  评论(0)    收藏  举报