题目
解题思路:
设
f
[
k
]
[
n
]
f[k][n]
f[k][n]为答案,那么至少包含一个1得答案为
f
[
k
−
1
]
[
n
−
1
]
f[k-1][n-1]
f[k−1][n−1],而一个1都不包含的则为
f
[
k
]
[
n
−
k
]
f[k][n-k]
f[k][n−k],答案
f
[
k
]
[
n
]
f[k][n]
f[k][n]自然就是
f
[
k
−
1
]
[
n
−
1
]
+
f
[
k
]
[
n
−
k
]
f[k-1][n-1]+f[k][n-k]
f[k−1][n−1]+f[k][n−k]
那么就得出转移方程
f
[
i
]
[
j
]
=
(
f
[
i
]
[
j
−
i
]
+
f
[
i
−
1
]
[
j
−
1
]
)
f[i][j] = (f[i][j-i] + f[i-1][j-1])
f[i][j]=(f[i][j−i]+f[i−1][j−1])
Accepted code:
#include<cstdio>
#include<algorithm>
using namespace std;
long long n, k, f[5005][5005];
int main() {
scanf("%d%d", &n, &k);
f[0][0]=1;
for (int i = 1; i <= k; i++)
for (int j = i; j <= n; j++)
f[i][j] = (f[i][j-i] + f[i-1][j-1])%998244353;
printf("%lld", f[k][n]);
}