acm 球和盒子模型总结

这篇博客详细总结了ACM竞赛中关于球和盒子模型的8种情况,包括球和盒子相同的场景以及不同场景下的解题策略。讨论了有无空盒的情况,并引入了整数拆分、隔板法、贝尔数、斯特林数等概念进行分析,提供了不同的计数方法和公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

N个球,M个盒子,允不允许有空盒,空盒本质上是M取值范围为[1,M]

1、球相同,盒子相同,有空盒

 归类为整数拆分,无顺序,2+33+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]






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值