一些ACM计数问题——球盒模型等
一些ACM计数问题——球盒模型等
1. 前置知识1
1.1 组合数
组合数的意义是从
它的公式是:
一般很少用它的递推形式:
1.2 隔板法
在一系列的球之间选几个缝隙,插入板,就是隔板问题。
例如
由于
1.3 生成函数
没学过生成函数的推荐 https://www.bilibili.com/video/BV1E24y1171z?vd_source=a18dbba15826659c13a0c2fac0a3673c
笼统来讲,对于一个有限or无限的数列
生成函数主要解决以下问题:
有
种不同的物品,其中第 种物品可以取出 个,问总共取出 个物品的方案数。
对于第
我们将
具体实现复杂度为
1.4 五边形数
五边形数就是如上图所示的点的个数。第
可通过差分前缀和求得通项公式:
如果将
关于五边形数,有五边形数定理:
欧拉函数
这个定理在后续正文讨论中会使用。
2. 正文1
球盒模型,是指将
- 球是否相同
- 盒子是否相同
- 盒子是否可以为空
接下来让我们一一进行解决。
1. 球相同,盒子不同,盒子不可以为空
等价于将球分为
2. 球相同,盒子不同,盒子可以为空
上个问题对于盒子的要求是:至少有一个球。
而本问题对于盒子的要求是:至少有零个球。
我们可以考虑将总球数增加
这样所对应的问题是:
然后我们可以把每个盒子中的每个球都删去一个,这样每个盒子都至少有零个球。此时总球数减少了
因此问题转化为:
可以发现和本问题是一模一样的。答案为
3. 球相同,盒子相同,盒子可以为空
可以使用动态规划解决,个人感觉这个dp的转移算是比较难想的啦。
令
关于状态转移,可以分为以下两中情况:
1、
2、
因此可得转移方程:
显然复杂度是
事实上,这个问题的特殊情况等价于整数划分问题,这里我们讨论一下:
一个整数
可以用多少种方式划分为其他整数的和?例如 : 5=1+1+1+1+1
5=1+1+1+2
5=1+2+2
5=1+1+3
5=2+3
5=1+4
5=5
这里我们把每个整数都看作一个物品,盒子有
我们这样考虑,一个整数
我们要求的,是将所有的生成函数进行累乘后得到的多项式中
在前置知识中,我们提到欧拉函数
因此,
将这个庞大的式子转化成多项式,根据多项式乘法,项
这里的
然而,除了常数项为
因此令上式子为
可以发现这是一个递推的形式。由于广义五边形数的量级为
4. 球相同,盒子相同,盒子不可以为空
和第一二种情况类似,该问题对盒子的要求是:至少一个球
而上个问题的要求是:至少零个球
因此我们把每个盒子都减去一个球,事实上求的就是上述dp解法的
当然,我们可以对这道题单独定义一个dp状态
然后根据上问题的转移,我们将状态分为“至少有一个盒子只有一个球”和“所有盒子都至少有大于一个球”的情况,得到转移式子:
原题链接:https://www.luogu.com.cn/problem/P1025
到目前为止,我们将所有球相同的情况都逐一进行了解读。事实上,正是球相同的这个性质,让我们可以在两种盒子是否为空的情况(如情况一二和情况三四)之间直接通过加球、删球来进行转换。
对于球不同的情况,我们还需要一点前置知识。
3. 前置知识2
3.1 第二类斯特林数
第二类斯特林数的定义和球盒模型相似:把
设第二类斯特林数为
1、前
2、前
因此递推式为
递推是
时间复杂度瓶颈为快速幂的复杂度
说来惭愧,作为一名ICPC银牌选手,我却从来没有了解过斯特林数。我记得不知道哪里的比赛考的裸的第二类斯特林数,当时我对着这个自己推出来的
的递推式想了半天怎么优化,想了一个小时想不出来,只能眼睁睁看着一堆人把这题过了,然后怀疑人生。赛后才知道有斯特林数这个东西。
4. 正文1
5. 球不同,盒子相同,盒子不可以为空
这个问题与第二类斯特林数一致。直接根据公式求即可。
6. 球不同,盒子相同,盒子可以为空
一种显然的想法:枚举不空盒子的个数,将对应的答案累加即可。
答案为
特殊地,若
7. 球不同,盒子不同,盒子可以为空
这个问题就非常简单了。对于每一个数,你都可以有
8. 球不同,盒子不同,盒子不可以为空
由于球不同,所以没办法通过将每个盒子进行减球来将问题转化为上一个情况。
考虑和第二类斯特林数(第五个情况)之间的差异,可以发现控制变量为:盒子不同了。
也就是说每个盒子都有了标号。所以很简单,我们只需要将第二类斯特林数乘上全排列个数