题意
有 N N N个珠子,把它们放到 K K K个盒子里,每个盒子非空,求出总方案数模 998244353 998244353 998244353。
思路
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]为前
i
i
i个珠子放了
j
j
j个盒子的方案数,可以得出动态转移方程:
f
[
i
]
[
j
]
+
=
f
[
i
−
1
]
[
j
−
1
]
新
一
个
盒
子
加
1
颗
珠
子
转
移
f[i][j]+=f[i-1][j-1]新一个盒子加1颗珠子转移
f[i][j]+=f[i−1][j−1]新一个盒子加1颗珠子转移
f
[
i
]
[
j
]
+
=
f
[
i
−
j
]
[
j
]
每
个
盒
子
都
加
上
1
转
移
f[i][j]+=f[i-j][j]每个盒子都加上1转移
f[i][j]+=f[i−j][j]每个盒子都加上1转移
保证不会重复。
代码
#include<cstdio>
int N, K, f[5001][5001];
int main()
{
scanf("%d %d", &N, &K);
for (int i = 1; i <= N; i++)
f[i][1] = 1;//初始化放到1个盒子只有一种方案数
for (int i = 2; i <= N; i++)
for (int j = 2; j <= K; j++) {
if (i > j) f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % 998244353;
else f[i][j] = f[i - 1][j - 1];
}
printf("%d", f[N][K] % 998244353);
}