容斥原理是组合数学中用于计数的一种基本方法,核心思想是:先不考虑重叠,把各种情况计数后,再减去重复计算的部分,加上被多减的部分,以此类推 .
两个集合的情况
设有两个集合 A A A 和 B B B ,我们想求它们的并集大小 ∣ A ∪ B ∣ |A \cup B| ∣ A ∪ B ∣ .
直接加 ∣ A ∣ + ∣ B ∣ |A| + |B| ∣ A ∣ + ∣ B ∣ 会把中间重叠部分 ∣ A ∩ B ∣ |A \cap B| ∣ A ∩ B ∣ 算两次,所以需要减去一次:
∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A \cup B| = |A| + |B| - |A \cap B| ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣
三个集合的情况
∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ B ∩ C ∣ − ∣ A ∩ C ∣ + ∣ A ∩ B ∩ C ∣ |A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |B \cap C| - |A \cap C| + |A \cap B \cap C| ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ B ∩ C ∣ − ∣ A ∩ C ∣ + ∣ A ∩ B ∩ C ∣
规律:奇加偶减 .即:
加 1 个集合的交集
减 2 个集合的交集
加 3 个集合的交集
……
一般形式# 设 A 1 , A 2 , … , A n A_1, A_2, \dots, A_n A 1 , A 2 , … , A n 是有限集合,则:
∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k − 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ A i 2 ∩ ⋯ ∩ A i k ∣ \left| \bigcup_{i=1}^n A_i \right| = \sum_{k=1}^n (-1)^{k-1} \sum_{1 \le i_1 < \dots < i_k \le n} |A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k}| i = 1 ⋃ n A i = k = 1 ∑ n ( − 1 ) k − 1 1 ≤ i 1 < ⋯ < i k ≤ n ∑ ∣ A i 1 ∩ A i 2 ∩ ⋯ ∩ A i k ∣ 使用补集:求“不满足任何性质”的元素个数# 正难则反,如果全集 U U U 中有一些“坏性质” P 1 , P 2 , … , P n P_1, P_2, \dots, P_n P 1 , P 2 , … , P n ,设 A i A_i A i 为满足性质 P i P_i P i 的元素集合,则不满足任何性质的元素个数 为:
∣ A 1 ‾ ∩ A 2 ‾ ∩ ⋯ ∩ A n ‾ ∣ = ∣ U ∣ − ∣ ⋃ i = 1 n A i ∣ |\overline{A_1} \cap \overline{A_2} \cap \dots \cap \overline{A_n}| = |U| - \left| \bigcup_{i=1}^n A_i \right| ∣ A 1 ∩ A 2 ∩ ⋯ ∩ A n ∣ = ∣ U ∣ − i = 1 ⋃ n A i
对于各个性质地位相等# 如果已知“各个性质彼此地位相等”,即对于选择一些性质后的交集大小只与性质的条数 k k k 有关,与这些性质具体是什么无关.我们就说这个问题是对称 的.换句话说,交集的大小和性质的条数呈函数关系,不妨记交集的大小为 a ( k ) a(k) a ( k ) ,故 a ( k ) a(k) a ( k ) 在 k k k 确定时为一定值,即
a ( k ) = ∣ A i 1 ∩ A i 2 ∩ ⋯ ∩ A i k ∣ ( ∀ i 1 < ⋯ < i k ) a(k)=|A_{i_1}\cap A_{i_2}\cap\cdots\cap A_{i_k}| \quad (\forall i_1<\dots<i_k) a ( k ) = ∣ A i 1 ∩ A i 2 ∩ ⋯ ∩ A i k ∣ ( ∀ i 1 < ⋯ < i k ) 则至少满足一个性质的元素个数:
∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k − 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n a ( k ) \Bigl|\bigcup_{i=1}^n A_i\Bigr|
= \sum_{k=1}^n (-1)^{k-1} \sum_{1\le i_1<\dots<i_k\le n} a(k) i = 1 ⋃ n A i = k = 1 ∑ n ( − 1 ) k − 1 1 ≤ i 1 < ⋯ < i k ≤ n ∑ a ( k ) 内层对每个 k k k 都要枚举 ( n k ) \binom{n}{k} ( k n ) 个交集,总共 2 n 2^n 2 n 项.
由于内层的每个性质条数为 k k k 的交集都等于 a ( k ) a(k) a ( k ) ,而性质条数为 k k k 的子集共有 ( n k ) \binom{n}{k} ( k n ) 个(一共 n n n 条性质),因此
∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( n k ) a ( k ) \sum_{1\le i_1<\dots<i_k\le n} |A_{i_1}\cap\cdots\cap A_{i_k}|
= \binom{n}{k} a(k) 1 ≤ i 1 < ⋯ < i k ≤ n ∑ ∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( k n ) a ( k ) 代入上式得
∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k − 1 ( n k ) a ( k ) \boxed{\Bigl|\bigcup_{i=1}^n A_i\Bigr| = \sum_{k=1}^n (-1)^{k-1} \binom{n}{k} a(k)} i = 1 ⋃ n A i = k = 1 ∑ n ( − 1 ) k − 1 ( k n ) a ( k ) 项数立刻由 2 n 2^n 2 n 降为 n n n (实际对 k k k 从 1 1 1 到 n n n 求和).这就是容斥原理的多项式形式 .
依此,有补集形式:不满足任何性质的元素个数:
∣ A 1 ‾ ∩ ⋯ ∩ A n ‾ ∣ = ∣ U ∣ − ∣ ⋃ i = 1 n A i ∣ = ∑ k = 0 n ( − 1 ) k ( n k ) a ( k ) |\overline{A_1}\cap\cdots\cap\overline{A_n}|
= |U| - \Bigl|\bigcup_{i=1}^n A_i\Bigr|
= \sum_{k=0}^n (-1)^k \binom{n}{k} a(k) ∣ A 1 ∩ ⋯ ∩ A n ∣ = ∣ U ∣ − i = 1 ⋃ n A i = k = 0 ∑ n ( − 1 ) k ( k n ) a ( k ) 其中规定 a ( 0 ) = ∣ U ∣ a(0)=|U| a ( 0 ) = ∣ U ∣ (选取 0 0 0 个性质即全集).
经典例子:错位排列# 求 1 , 2 , ⋯ , n 1,2,\cdots ,n 1 , 2 , ⋯ , n 的排列 a a a 中满足 a i ≠ i a_i \neq i a i = i 的排列数.
正难则反,可以定义性质 P i P_i P i :第 i i i 位是 i i i .显然对称.
a ( k ) a(k) a ( k ) :固定某 k k k 个位置不动,其余 n − k n-k n − k 个位置任意排列,故 a ( k ) = ( n − k ) ! a(k)=(n-k)! a ( k ) = ( n − k )!
∣ U ∣ = n ! |U|=n! ∣ U ∣ = n !
错位排列数:
D n = ∑ k = 0 n ( − 1 ) k ( n k ) ( n − k ) ! D_n = \sum_{k=0}^n (-1)^k \binom{n}{k} (n-k)! D n = k = 0 ∑ n ( − 1 ) k ( k n ) ( n − k )! 化简即为 D n = n ! ∑ k = 0 n ( − 1 ) k k ! D_n = n! \sum_{k=0}^n \frac{(-1)^k}{k!} D n = n ! ∑ k = 0 n k ! ( − 1 ) k ,复杂度 O ( n ) O(n) O ( n ) .
二项式反演# 设我们有一个包含 n n n 个性质的集合.
f k f_k f k :恰好 满足 k k k 个性质的元素个数.
g k g_k g k :钦定 必须满足某 k k k 个特定性质的元素个数,但不关心其他性质是否满足.更准确地说,我们选定 k k k 个性质,强制要求元素满足这 k k k 个性质,而其余 n − k n-k n − k 个性质可以满足也可以不满足.从 n n n 个性质中选择 k k k 个来钦定有 ( n k ) \binom{n}{k} ( k n ) 种选择方案,因此我们定义 g k g_k g k 为所有 ( n k ) \binom{n}{k} ( k n ) 种选法的总和,即
g k = ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ { x : x 满足性质 P i 1 , … , P i k } ∣ g_k = \sum_{1\le i_1<\dots<i_k\le n} \bigl|\{x : x \text{ 满足性质 } P_{i_1},\dots,P_{i_k}\}\bigr| g k = 1 ≤ i 1 < ⋯ < i k ≤ n ∑ { x : x 满足性质 P i 1 , … , P i k } 如果问题是对称的, g k g_k g k 就等于 ( n k ) × a ( k ) \binom{n}{k} \times a(k) ( k n ) × a ( k ) .
关系推导# 任何一个恰好满足 i i i 个性质的元素,在计算 g k g_k g k 时,会被重复计数.具体来说,若一个元素 x x x 恰好满足 i i i 个性质(i ≥ k i \ge k i ≥ k ),那么从这 i i i 个性质中选出 k k k 个来“钦定”的方式有 ( i k ) \binom{i}{k} ( k i ) 种.即 x x x 会出现在 ( i k ) \binom{i}{k} ( k i ) 个钦定子集之中,它对每一个子集的贡献都为 1,因此它对 g k g_k g k 的贡献是 ( i k ) \binom{i}{k} ( k i ) .
于是有:
g k = ∑ i = k n ( i k ) f i g_k = \sum_{i=k}^n \binom{i}{k} f_i g k = i = k ∑ n ( k i ) f i 反演公式# 已知 g k g_k g k ,想要求出 f k f_k f k ,就需要反演上面的关系.二项式反演告诉我们:
f k = ∑ i = k n ( − 1 ) i − k ( i k ) g i \boxed{f_k = \sum_{i=k}^n (-1)^{i-k} \binom{i}{k} g_i} f k = i = k ∑ n ( − 1 ) i − k ( k i ) g i 常见应用#
错位排列:
f 0 f_0 f 0 = 没有不动点的排列数(错排数 D n D_n D n )
a ( k ) a(k) a ( k ) = 固定 k k k 个位置不动,其余任意排列的方法数 = ( n − k ) ! (n-k)! ( n − k )!
由 g k = ( n k ) ( n − k ) ! g_k = \binom{n}{k}(n-k)! g k = ( k n ) ( n − k )! ,用反演求出 f 0 f_0 f 0 .
组合计数:求恰好有 k k k 个指定特征的方案数.