组合数学学习笔记
前言
本篇笔记主要参考了学长 YYR 的 PPT。
组合数学是数学中一个庞大的分支,在 OI 中也占有一些比重。因此,了解基础的组合数学知识也对 OI 非常重要。
目录
- 组合数
- 容斥
- 卡特兰数
- 二项式系数 (upd on 2020/8/2)
组合数
基本概念
排列数: 从 \(n\) 个不同元素中,选择其中 \(m\) 个元素并进行排列的方案数,记作 \(A(n,m)\) 或者 \(A^m_n\) 。
- 排列数的计算: \(A^m_n=\frac{n!}{(n-m)!}\)
组合数: 从 \(n\) 个不同元素中,选择其中 \(m\) 个元素作为一个组合的方案数,记作 \(C(n,m)\)或者 \(C^m_n\) 。
- 组合数的计算: \(C^m_n=\frac{n!}{(n-m)!m!}\)
- 组合数的性质:
-
- \(C(n,m)=\frac{A(n,m)}{m!}\)
-
- \(C(n,m)=C(n,n-m)\)
-
- \(C(n,m)=C(n-1,m-1)+C(n-1,m)\)
-
杨辉三角形
一个与组合数密切相关的三角形。形如:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
显然,某一项的数字为其正上方和左上方的数字之和。我们发现,杨辉三角第 \(n\) 行第 \(m\) 列上的数字即为 \(C(n,m)\)(行列标号从 \(0\) 起始)。这也符合上面的性质 \(3\): \(C(n,m)=C(n-1,m-1)+C(n-1,m)\)。
二项式定理
基本形式:\((x+y)^n=\sum_{i=1}^{n} C^i_n x^n y^{n-i}\)
注意到,对于 \((x+y)^n\) 展开后的系数其实和杨辉三角第 \(n\) 行的系数一致。比如说 \((x+y)^3\) 的系数就为 \(1,3,3,1\)。
组合数算法
算法 \(\texttt{A}\):杨辉三角递推
注意到杨辉三角形,我们显然可以写出递推式 \(C(i,j)=C(i-1,j-1)+C(i-1,j)\)。
时间复杂度 \(O(n^2)\)。
算法 \(\texttt{B}\):用阶乘计算
我们有组合数的计算公式 \(C^m_n=\frac{n!}{(n-m)!m!}\),可以预处理出 \(n!\) 的值和 \(n!\) 的逆元。注意这个方法只有当模数 \(P>n\) 且为质数时才成立。
当 \(P<n\) 且为质数时,我们要考虑 \(n\) 以内 \(P\) 的倍数。令 \(fac[n]\) 为 \(n! \mod P\),\(facinv[n]\) 为 \(fac[n]\) 在 \(P\) 下的逆元。
我们令 \(times[i]\) 表示 \(i!\) 中 \(P\) 的出现次数(即 \(i!\) 唯一分解后,\(P\) 对应的指数),而 \(fac[i]\) 和 \(facinv[i]\) 对应需要把 \(P\) 排除在外(递推过程中,假设需要乘上 \(k\),则先将 \(k\) 尽可能地除以 \(P\))。
则计算 \(C(n, m)\) 时,首先判断 \(times[n]-times[m]-times[n-m]\) 是否为 \(0\),不为 \(0\) 时则答案为 \(0\),否则答案仍为 \(fac[n] \times facinv[m] \times facinv[n-m] \mod p\)。
Lucas 定理
用来计算组合数的另一种算法,适用于当 \(n\) 较大以至于 \(O(n)\) 处理都不行,而模数 \(p\) 较小且为质数的情况。运用 Lucas 定理求组合数的复杂度为 \(O(\log_pn)\)。
- Lucas 定理基本内容:\(C(n, m) \bmod p =C\left(\left\lfloor\frac{n}{p}\right\rfloor,\left\lfloor\frac{m}{p}\right\rfloor\right) * C(n \bmod p, m \bmod p) \bmod p\)
这里省略了有关证明,可自行百度。
习题
- 有 \(a\) 个白球、\(b\) 个黑球进行排列,球之间仅有黑白之分,即两个方案不同当且仅当某一位置球的颜色不同,求方案数。
【解答】从 \(a+b\) 个位置中选出 \(a\) 个位置放白球即可,答案为 \(C_{a+b}^a\)。
- 有 \(n\) 个球,放入 \(m\) 个盒子,球没有区别,盒子有区别。求方案数。
【解答】插板法。相当于 \(n+m-1\) 个位置中选出 \(m-1\) 个位置作为插板。答案即 \(C_{n+m-1}^{m-1}\)。
容斥
容斥原理
\(\left|\bigcup_{i=1}^{n}\right|=\sum\limits_{i=1}^{n}\left|A_{i}\right|-\sum\limits_{i, j, 1\leq i<j \leq n}\left|A_{i} \cap A_{j}\right|+\sum\limits_{i, j, k, 1 \leq i<j<k \leq n}\left|A_{i} \cap A_{j} \cap A_{k}\right|-\cdots+(-1)^{n-1}\left|A_{1} \cap A_{2} \cap \cdots \cap A_{n}\right|\)
利用这个公式,我们可以实现常见的交集转并集,大大简化运算的复杂度。注意容斥原理的一定是加减交替。
- 容斥原理证明:
考虑证明,对于并集中的任一元素 \(t\),其在右式中仅被计入一次。假设 \(t\) 被 \(s\) 个集合包含。
选择 \(1\) 个集合的交集时,对该元素计入次数贡献为 \(+C_s^1\)。
选择 \(2\) 个集合的交集时,对该元素计入次数贡献为 \(-C_s^2\)。
最终元素 \(t\) 的被计入次数为 \(C_{s}^{1}-C_{s}^{2}+C_{s}^{3}-C_{s}^{4}+\cdots+(-1)^{s-1} C_{s}^{s}\)。
由「二项式定理」我们知道 \((1-1)^{s}=C_{s}^{0}-C_{s}^{1}+C_{s}^{2}-\cdots+(-1)^{s} C_{s}^{s}=0\),因而元素 \(t\) 的被计入次数为 \(C_s^0 = 1\)。
证毕。
习题
-
[HAOI2008] 硬币购物
题意:有四种面额的硬币,面值分别为 \(c_1, c_2, c_3, c_4\),硬币数目分别为 \(d_1, d_2, d_3, d_4\),现要购买价值恰为 \(s\) 的产品,试问有多少种方案。(\(d_i, s \le 100000\))
解题:首先假设没有上限,那么可以直接跑无限背包。当有上限的时候,可以从总方案中减去不合法的方案数,求不合法的方案数可以先假设该硬币超过了其面值,即 \(c_i \times (d_i+1)\),然后一样的无限背包。最后容斥一下即可。
卡特兰数
定义
-
定义: 对于满足 \(h(0)=h(1)=1\),以及递推式 \(h(n)=h(0)h(n−1)+h(1)h(n−2)+…+h(n−1)h(0)\) 的数列 \(h\),称其为卡特兰数。
-
通项公式: \(h(n)=\frac{C_{2n}^n}{n+1}\)
经典问题
-
有 \(n\) 个元素要进栈,依次编号为 \(1\sim n\),每次你可以选择将下一个未入栈的元素入栈,或是将栈顶元素弹出并记录。最终将得到一个长为 \(n\) 的出栈序列,出栈序列的方案数以为 \(h(n)\) 种。
证明:假设当前出栈的元素为 \(k\),\(k\) 出栈后栈空。则两部分 \(1 \sim k-1\) 和 \(k+1 \sim n\) 变为了两个子问题,且他们相互独立。对于当前这个元素 \(k\),方案数 \(h(n) += h(k-1) \times h(n-k)\)。最后 \(h(n)\) 即为 \(\sum\limits^{n-1}_{i=0} h(i) \times h(n-1-i)\),此即卡特兰数。
-
\(1 \sim n\) 一共 \(n\) 个数按照中序递增形成了一棵排序二叉树,问有多少个不同的排序二叉树。两棵树不同,当且仅当存在一个结点,在两树中的左儿子或右儿子不同。答案即为 \(h(n)\)。
证明:和上面一样,假设当前根节点为 \(k\),下面有 \(n\) 个节点。则 \(1 \sim k-1\) 必然在 \(k\) 左侧,而 \(k+1 \sim n\) 必然在 \(k\) 右侧,然后可以递归求解,两个子问题相互独立。因此对于当前这个根节点 \(k\),方案数增加了 \(h(k-1) \times h(n-k)\),最后即为卡特兰数。
二项式系数
这玩意儿一般是在具体数学中学的。鉴于个人感觉这东西和组合数还是有点关联,于是放在这里说。
定义
二项式系数:
- 下降幂 \(n^{k \downarrow}=n(n-1) \ldots(n-k+1)\)
- 其中,\(n \in \mathbb{R},k \in \mathbb{Z}\)
其实,\(C(n,k)\) 亦可以写作 \(\dbinom{n}{m}\),但也不完全相同。仅当 \(n \in \mathbb{N},k \in \mathbb{N}\) 时两者是相等的。
整数域的杨辉三角形
n = -2: 1 -2 3 -4 5 -6
n = -1: 1 -1 1 -1 1 -1
n = 0: 1 0 0 0 0 0
n = 1: 1 1 0 0 0 0
n = 2: 1 2 1 0 0 0
n = 3: 1 3 3 1 0 0
n = 4: 1 4 6 4 1 0
n = 5: 1 5 10 10 5 1
单个二项式系数的公式
- 自然数下的定义式
- 加法公式
- 对称公式(仅限自然数域)
- 上指标反转
- 吸收公式
二项式系数的和式
- 上指标求和 I
- 上指标求和 II
- 对于自然数 \(n\),一行的交错和为 \([n=0]\),即 \(\sum\limits_{m=0}^{n}(-1)^m \dbinom{n}{m} = [n=0]\)。
范德蒙德卷积
范德蒙德卷积还有许多导出结论。但这个基本柿子是需要记住的。
二项式反演
第二个公式一般更加常用。该公式常用于容斥相关的计数问题,常与 dp 相结合。

浙公网安备 33010602011771号