题目
解题思路:
设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#include 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]);}