正题
题目大意
将n个相同球放到k个相同的盒子里,求方案数。
解题思路
其实就是将n划分成k份,要求前面份的大于等于后面的,所以我们可以写dp
fi,jf_{i,j}fi,j表示分成i组,分了j。
然后
fi,j=fi−1,j−1+fi,j−if_{i,j}=f_{i-1,j-1}+f_{i,j-i}fi,j=fi−1,j−1+fi,j−i
fi−1,j−1f_{i-1,j-1}fi−1,j−1表示分出一个,值为1
fi,j−if_{i,j-i}fi,j−i表示前i份都加上一
这个方程因为后面加的时候前面也会加,就保证了前面的大于等于后面的。
code
#include<cstdio>
#define ll long long
#define XJQ 998244353
using namespace std;
ll n,m,f[5010][5010];
int main()
{scanf("%lld%lld",&n,&m);f[0][0]=1;for(ll i=1;i<=m;i++)for(ll j=i;j<=n;j++)f[i][j]=(f[i][j-i]+f[i-1][j-1])%XJQ;printf("%lld",f[m][n]);
}