容斥原理与错排数初学习笔记

· · 算法·理论

简述

容斥原理是一种计数技巧,用来解决多个条件同时满足/不满足时的计数问题。

公式

两个元素的容斥

|A \cup B| = |A| + |B| - |A \cap B|

三个元素的容斥

|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C|

容斥原理的一般公式

= \sum_{k=1}^{n} (-1)^{k+1} \sum_{1 \le i_1 < i_2 < \dots < i_k \le n} \left| A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k} \right|

这里的 (-1)^{k+1},当 k=1 时为正、当 k=2 时为负、当 k=3 时为正,等等。形成正负正负的交替,是容斥原理的核心。

公式 \sum_{1 \le i_1 < i_2 < \dots < i_k \le n} \left| A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k} \right| 表示,取 k 个集合交的大小。

运用

若有 n 个性质,我们通常会求:

全集 U 中,不满足任何性质的元素有多少个

A_i 为满足性质 i 的集合。

则不满足任何性质的集合就是 U / (A_1 \cup A_2 \cup A_3 \cap \dots \cap A_n)

考虑如何计算 A_1 \cup A_2 \cup A_3 \cap \dots \cap A_n,可以发现这就是容斥原理公式的结果。

即,可以写成:

|U| - \sum_{k=1}^{n} (-1)^{k+1} \sum_{i_1 < \dots < i_k} |A_{i_1} \cap \dots \cap A_{i_k}|

等价于:

|U| - \left( \sum |A_i| - \sum |A_i \cap A_j| + \sum |A_i \cap A_j \cap A_k| - \dots \right)

可以发现这里的全集 U 其实就是所有元素的并,考虑把全集放进去,就是当 k=0 时,0 个集合的交,所有元素都属于 0 个集合的交,因此最终形式为:

\boxed{ \sum_{k=0}^{n} (-1)^k \sum_{1 \le i_1 < \dots < i_k \le n} |A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k}| }

其中 k=0 时,定义为 |U|

其中公式里的 |A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k}| 的意思,不是 至少 k 个性质成立,而是 指定这 k 个性质成立,其他性质是否成立不管,是可能有重复的!

错排问题I

n 封信,编号为 1,2,3,\cdots,n;装到 n 个信箱里,编号为 1,2,3,\cdots,n。每封信都不在自己编号的信封里,求方案数。

设全集 Un!(所有排列)。
A_i 表示“第 i 封信装进了第 i 个信封”。

要求的是“不满足任何 A_i”的排列数。

推导

指定 k 封信装对,其他随便装,共有 C_n^k \cdot (n-k)! 种方案。

其中 C^k_n 表示指定 k 封信装对;(n-k)! 表示剩下 n-k 个信封随便装。

根据我们刚刚的最终形式公式,可得错排公式基本形式:

D_n = \sum_{k=0}^{n} (-1)^k C_n^k (n-k)!

进一步化简,C_n^k=\frac{n!}{k!(n-k)!},因此原式等于:

D_n = \sum_{k=0}^{n} (-1)^k \frac{n!}{k!(n-k)!} (n-k)!

即最终化简为:

\boxed{D_n = n! \sum_{k=0}^{n} \frac{(-1)^k}{k!}}

这就是错排公式。

错排公式递推公式

添加于 2026828 日。

首先是初始值,易得 D_0=1D_1=0。因为 0 个元素的排列只有一个空排列,没有固定点,所以 D_0=1

接下来推导 D_n(n\ge2) 的递推公式。

推导

首先考虑元素 1,它一定不能放在位置 1,假设放在了位置 kk 的选择有 n-1 种。

接下来考虑元素 k 放在哪里。

情况 1

元素 k 放在位置 1。也就是说元素 1k 互换了位置。此时剩下 n-2 个元素进行错排,即 D_{n-2}

情况 2

元素 k 不放在位置 1

接下来是一个很神的转化!

我们令位置 k 改名为位置 1位置 1 改名为位置 k

此时即为“元素 k 不放进位置 k”,而原先的元素 1 已经在位置 1 了,不再参与剩余排列。

此时,剩下 n-1 个元素,就是元素 2\sim n

剩下 n-1 个位置,就是位置 2\sim n

我们要把这 n-1 个元素放在剩下 n-1 个位置上,并满足错排限制。

即为 D_{n-1}

最终公式

这里 kn-1 种情况。

因此,错排数的递推公式为:

\boxed{D_n=(n-1)\times(D_{n-2}+D_{n-1})}

错排问题II

m 封信,编号为 1,2,3,\cdots,m;选择其中 n 封信,装到 n 个信箱里,编号为 1,2,3,\cdots,n。每封信都不在自己编号的信封里,求方案数。

设全集 UA^n_m(所有排列)。
A_i 表示“第 i 封信装进了第 i 个信封”。

同理,要求的是“不满足任何 A_i”的排列数。

推导

指定 k 封信装对,其他随便装,共有 C_n^k \cdot A^{n-k}_{m-k} 种方案。

其中 C^k_n 表示指定 k 封信装对;A^{n-k}_{m-k} 表示其他的 m-k 封信选 n-k 封的排列数。

根据我们刚刚的最终形式公式,可得错排公式II:

\boxed{P(m,n) = \sum_{k=0}^{n} (-1)^k C_n^k \cdot A^{n-k}_{m-k}}