组合数学
# 组合数学
# 容斥原理
容斥原理的简单形式,设 和 是分别具有性质 和 的有限集,有
e.g. 求正整数 到 中,既不是 的倍数也不是 的倍数的数的个数
设 , 是 的倍数, 是 的倍数,那么答案就是
由于 , 所以答案就是
e.g. 求由 个元素 全排列中,满足 和 不相邻, 和 不相邻的排列数
设 是 和 相邻, 是 和 相邻,那么答案就是
所以答案就是
考虑三个子集的容斥原理
推广到 个集合
设 是一个有限集, 是 的 个子集,那么
我们对答案取补集的形式也很常见:
这里需要定义
e.g. 件不同的物品,分配给 个人,要求每个人至少要分得一件物品,求不同的分配方案数
设 总方案数, 第 个人没有分到物品的方案数
答案就是
就是 个人分配 件物品的方案数,即
得到了答案的递推式:
e.g. 错排问题: 是一个排列,满足 的数的个数称为错排数,求错排数
设 是所有排列数, 是 不在 的位置的排列数
容斥原理的符号形式
设 是一个有限集, 是 种性质
- 记 为 中有 性质的元素的数量。特殊的,记
- 记 为 中没有 性质的元素的数量
- 为 中同时有 ,性质的元素的数量
- 记
通过符号形式,我们可以把容斥原理改成多项式来处理
则,容斥原理可以写成:
e.g. 求正整数 到 中,既不是 的倍数,也不是 的倍数,但是 的倍数的数的数量
设 设 的倍数, 是 的倍数, 是 的倍数
答案就是
# 特殊的数
# Catalan 数
Catalan 数有三种计算公式
公式 :
公式 可以从一个基本模型推导出来:把 个 和 个 排成一行,使这一行的任意 个数中 的数量总是大于或等于 的数量,这样的排列一共有 个
公式 :
公式 :
模型 1:棋盘问题
一个 行 列的棋盘,从左上角走到右上角,一直在对角线右下方走,不穿过主对角线,走法有多少种?
对方向编号,向上为 ,向右为 ,那么从左下角到右上角一定会经过 个 和 个 ,如果第 步之前 的个数超过 的个数了,就说明一定超过对角线了
从左下角到右上角的路线方案总共有 种:
- A :在对角线下方的方案数
- B :在对角线上方的方案数
- C :穿过对角线的方案数
显然, ,现在的问题转化成如何求
我们需要找一条穿过对角线或者完全在对角线上方的路线,然后按照一条虚线映射
我们发现,一条穿过对角线的路线和新路线是一一对应的,而新路线的方案数是 ,从 个里面选 个 ,选 个
所以
使用生成函数推导
根据递推公式:
定义生成函数 ,那么:
考虑类似于实数的二次方程,解得:
其中:
所以:
# 斯特林数
# 第二类斯特林数
考虑一个问题:
有 个互不相同的求球,放到 个互不区分的盒子里,每个盒子里至少要有一个球,球方案数
用动态规划来解决这个问题
我们定义 为第二类斯特林数,记作 ,这种方法的时间复杂度为
考虑用容斥原理求出 的递推式
先把盒子按照 编号,设 表示第 个盒子没有球,答案就是
则我们能得到第二类斯特林数的通项公式
第二类斯特林数还有一个重要的公式
可以思考组合意义来理解,把 个相互区分的球放到 个相互区分盒子里面,朴素的方法就是
我们可以先去 个盒子放球,要求每个盒子中至少有一个球,这个的方案数就是
第二类斯特林数有关于 的指数生成函数
这样就可以求一行的斯特林数,就是 固定
我们有
设
所以
总时间复杂度为
# 分拆数
个无标号的球分配到 和无标号的盒子的方案数,每个盒子不为空,记为
有递推关系
构造一种排列方式,一共有 行,每一行的球的数量都比上一行少,每一列考虑:
- 如果最后一行只有一个球
- 如果最后一行不止一个球
关于 的常生成函数:
如何快速求 :先取 ln 再 exp
个无标号的球分配到一些无编号盒子,每个盒子不为空的方案数,记为
有
递推关系
常生成函数
这个表展示了一些经典的分配问题