N个球,M个盒子,允不允许有空盒,空盒本质上是M取值范围为[1,M]
1、球相同,盒子相同,有空盒
归类为整数拆分,无顺序,2+3与3+2相同
//dp[N][M],将整数N分解为M份,高端霸气上档次的五边形优化之后再说吧
if(i > j) dp[i][j] = dp[i-1][j];
if(i == j) dp[i][j] = dp[i-1][j] + 1;
if(i < j) dp[i][j] = dp[i - 1][j] + dp[i][j - i];
2、球相同,盒子相同,没有空盒
从上一个式子改编dp[N - M][M]
3、球相同,盒子不同,有空盒
归类为整数拆分,有顺序
隔板法C(N + M - 1,M - 1)
4、球相同,盒子不同,没有空盒
隔板法C(N - 1,M - 1)
5、球不同,盒子相同,有空盒
归类为bell数,sigma(S[N, 1]...S[N, M]),计算见下
void getBell()
{
static int bellfirst = 1;
if(bellfirst) {getStir2();bellfirst = 0;}
for(int i = 1;i <= 2000;i++)
{
bell[i] = 0;
for(int k = 1;k <= i;k++)
bell[i] = (bell[i] + stir2[i][k]) % mod;
}
}
6、球不同,盒子相同,没有空盒
归类为第二类斯特林数,S[N,K] = 1 K=1||K=N
void getStir2()
{
for(int i = 1;i <= 2000;i++)
{
stir2[i][0] = 0;
stir2[i][i] = 1;//易错
for(int k = 1;k < i;k++)
{
stir2[i][k] = (stir2[i - 1][k - 1] + k*stir2[i - 1][k])%mod;
}
}
}
7、球不同,盒子不同,有空盒
M^N
8、球不同,盒子不同,没有空盒
M!*S[N,M]