Loading

组合数学学习笔记

前言

本篇笔记主要参考了学长 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!}\)
  • 组合数的性质:
      1. \(C(n,m)=\frac{A(n,m)}{m!}\)
      1. \(C(n,m)=C(n,n-m)\)
      1. \(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)\),最后即为卡特兰数。


二项式系数

这玩意儿一般是在具体数学中学的。鉴于个人感觉这东西和组合数还是有点关联,于是放在这里说。

定义

二项式系数:

\[\left(\begin{array}{l} n \\ k \end{array}\right)=\left\{\begin{array}{ll} \frac{n^{k \downarrow}}{k !}, & k \geq 0 \\ 0, & k<0 \end{array}\right. \]

  • 下降幂 \(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

单个二项式系数的公式

  • 自然数下的定义式

\[\left(\begin{array}{l} n \\ k \end{array}\right)=\frac{n !}{k !(n-k) !}, \quad n \in \mathbb{N}, \quad n \geq k \geq 0 \]

  • 加法公式

\[\left(\begin{array}{l} n \\ k \end{array}\right)=\left(\begin{array}{l} n-1 \\ k-1 \end{array}\right)+\left(\begin{array}{c} n-1 \\ k \end{array}\right), \quad n \in \mathbb{R}, k \in \mathbb{Z} \]

  • 对称公式(仅限自然数域)

\[\left(\begin{array}{l} n \\ k \end{array}\right)=\left(\begin{array}{c} n \\ n-k \end{array}\right), \quad n \in \mathbb{N} \]

  • 上指标反转

\[\left(\begin{array}{l} n \\ k \end{array}\right)=(-1)^{k}\left(\begin{array}{c} k-n-1 \\ k \end{array}\right), \quad n \in \mathbb{R}, k \in \mathbb{Z} \]

  • 吸收公式

\[k\left(\begin{array}{l} n \\ k \end{array}\right)=n\left(\begin{array}{l} n-1 \\ k-1 \end{array}\right),\quad n \in \mathbb{R}, k \in \mathbb{Z} \]

二项式系数的和式

  • 上指标求和 I

\[\left(\begin{array}{l} 0 \\ m \end{array}\right)+\left(\begin{array}{l} 1 \\ m \end{array}\right)+\cdots+\left(\begin{array}{l} n \\ m \end{array}\right)=\left(\begin{array}{l} n+1 \\ m+1 \end{array}\right) \]

  • 上指标求和 II

\[\left(\begin{array}{l} n \\ 0 \end{array}\right)+\left(\begin{array}{c} n+1 \\ 1 \end{array}\right)+\cdots+\left(\begin{array}{c} n+m \\ m \end{array}\right)=\left(\begin{array}{c} n+m+1 \\ m \end{array}\right) \]

  • 对于自然数 \(n\),一行的交错和为 \([n=0]\),即 \(\sum\limits_{m=0}^{n}(-1)^m \dbinom{n}{m} = [n=0]\)

范德蒙德卷积

\[\sum_{k}\left(\begin{array}{c} r \\ m+k \end{array}\right)\left(\begin{array}{c} s \\ n-k \end{array}\right)=\left(\begin{array}{c} r+s \\ m+n \end{array}\right) \]

范德蒙德卷积还有许多导出结论。但这个基本柿子是需要记住的。

二项式反演

\[\begin{array}{c} g(n)=\sum_{k}(-1)^{k}\left(\begin{array}{l} n \\ k \end{array}\right) f(k) \Longleftrightarrow f(n)=\sum_{k}(-1)^{k}\left(\begin{array}{l} n \\ k \end{array}\right) g(k) \\ g(n)=\sum_{k}\left(\begin{array}{l} n \\ k \end{array}\right) f(k) \Longleftrightarrow f(n)=\sum_{k}(-1)^{n-k}\left(\begin{array}{l} n \\ k \end{array}\right) g(k) \end{array} \]

第二个公式一般更加常用。该公式常用于容斥相关的计数问题,常与 dp 相结合。

posted @ 2020-08-02 16:03  Sqrtyz  阅读(396)  评论(0)    收藏  举报