容斥原理

容斥原理

在1到100的整数中,我们想数出“既不是2的倍数,也不是3的倍数,也不是5的倍数”的数的个数。我们发现,我们很容易数出2的倍数的个数、3的倍数的个数、5的倍数的个数,但是由于这些个数之间有重叠,所以如果把100减去这些个数的总和,就多减了一点。为了弥补多减的部分,我们依次把同时是2和3的倍数的、同时是2和5的倍数的、同时是3和5的倍数的给加回来。但接着又发现加回来的太多了。如果这时我们再把同时是2、3、5的倍数的数的个数给减掉,就恰好得到了正确的答案。

以上这个过程可以在韦恩图上比较清晰的表达出来。把这个问题描述的对象抽象出来,我们发现我们在解决这样一个问题:我们的元素有一些性质,我们想要统计“不满足所有这些性质”的元素个数,但是这不容易计算。然而,“满足”其中几条性质的元素个数却是容易计算的。为了叙述方便,由于我们想要求出的是所有性质都不满足的元素,所以满足某条性质就是件“坏事”。所有满足某条性质的元素的集合就是一个“坏集合”。相反,所有性质都不满足的元素就是“好的”。坏集合以及坏集合的交是容易计算的。我们想要通过一种方法把各种坏集合的交集加加减减来求出好集合的大小,这就是容斥原理。

在给定的一个大集合\(U\)中,设坏集合为\(A_1,\cdots,A_m\)。已知\(|\bigcap\limits_{i=1}^{k}A_{p_i}|\)是容易计算的。目标就是计算出\(|\bigcap\limits_{i=1}^{m} \bar{A_i}|\)

为了方便理解,我们引入记号。把坏集合的集合记为\(\mathscr{A}=\{A_1,\cdots,A_m\}\)。设\(J\)\(\mathscr{A}\)的一个子集,即\(J\)是某几个坏集合组成的集合。定义

\(N_=(J)=|\{x \in U | \forall A_i \in J, x \in A_i 且 \forall A_i \in \mathscr{A} \backslash J, x \notin A_i\}|\)

\(N_=(J)\)表示所有只满足\(J\)种坏性质而不满足其它任何坏性质的元素。比如在刚才的例子中,\(N_=(\{2,5\})\)就表示所有又是2的倍数又是5的倍数,但不是3的倍数的数。注意到,\(N_=(\empty)\)就表示不满足任何坏性质的元素,也就是“好元素”,就是我们要的答案。

\(N_=(J)\)往往是难求的。而根据我们的设定,\(N_\geq (J)=|\{x \in U | \forall A_i \in J, x \in A_i\}|\),即所有满足了这些坏性质别的啥都不管的元素,是容易求出的。其中\(N_\geq(\empty)=U\)

容斥原理就是指出:

\(N_=(\emptyset) = \sum\limits_{J\subseteq \mathscr{A}} (-1)^{|J|}N_\ge(J)\)

根据定义,等式左侧即为\(|\bigcap\limits_{i=1}^{m} \bar{A_i}|\),而右侧可以改写为\(\sum\limits_{j=0}^m (-1)^j \sum\limits_{J\in\binom{\mathscr{A}}{j}} N_\ge(J)\)。我们考虑每个元素的贡献。如果\(x \in N_=(\empty)\),将在左侧贡献1。这意味着\(x\)不属于任何坏集合,因此它在右侧只会在\(j=0\)时(即\(J=\empty\))时被统计到,刚好在\(N_\geq(\empty)\)中贡献1次;如果\(x \notin N_=(\empty)\),那么左侧贡献0。\(x\)出现在了某个或某几个坏集合中,不妨设出现在\(A_{i_1},\cdots,A_{i_t}\)中,那么当且仅当\(J \subseteq \{A_{i_1},\cdots,A_{i_t}\}\)时(包括空集)右侧才会贡献,总的贡献恰好为\(\sum\limits_{j=0}^{t}(-1)^j \dbinom{t}{j}=\sum\limits_{j=0}^{t}\dbinom{t}{j}(-1)^j (1)^{t-j}=(-1+1)^t=0\)。证毕。

对于\(N_=\)中不为空集的情况,我们可以证明更一般的容斥原理:

\(N_=(S)=\sum\limits_{J:S \subseteq J \subseteq \mathscr{A}}(-1)^{|J|-|S|}N_\geq(J)\)

\(\forall x \in N_=(S)\),则左边贡献1。等式右边当且仅当\(x \in N _\geq (J)\)才产生贡献,这要求\(J \subseteq S\)。而\(S \subseteq J\),因此必须有\(S=J\)。因此等式右边也恰好贡献1。

如果\(x \notin N_=(S)\),则左边贡献0。等式右边,如果\(S \subsetneq A\),那么对于所有等式中的\(J\)\(N_\geq(J)\)都产生贡献。于是由\(\sum\limits_{S \subseteq J \subseteq A}(-1)^{|J|-|S|}N_\geq(J)=\sum\limits_{j=|S|}^{|A|}(-1)^{j-|S|} \sum\limits_{S \subseteq J \in \binom{A}{j}}N_\geq(J)\),右侧贡献\(\sum\limits_{j=0}^{|A|-|S|}(-1)^j \dbinom{|A|-|S|}{j}=(-1+1)^{|A|-|S|}=0\)。而如果本身就有\(S=A\),则右侧等式直接可以写作\(N _\geq(A)=N_=(A)\),等式成立。

证毕。

应用

错位排列通项

一个排列是错位排列当且仅当\(a_i \neq i\)恒成立。我们把\(a_i=i\)看作坏事件\(A_i\)。那么容易求出\(N_\geq(\{A_{i_1},\cdots,A_{i_t}\})=(n-t)!\)

代入容斥原理的公式,\(N_=(\empty)=\sum\limits_{j=0}^n (-1)^j \sum\limits_{J\in\binom{\mathscr{A}}{j}} (n-j)!=\sum\limits_{j=0}^n (-1)^j \dbinom{n}{j} (n-j)!\)

第二类斯特林数通项

\(k\)个球\(n\)个箱子,球不同箱子不同至少一个,答案是\(\left\{\begin{array}{l} k \\ n \end{array}\right\}n!\)。而不从分组的角度而从球的角度看,相当于求从\([k]\)\([n]\)的满射的个数。那么利用容斥原理,把\(i\)没有被射到看作坏事件\(A_i\),那么有\(N_\geq(\{A_{i_1},\cdots,A_{i_t}\})=(n-t)^k\)。于是有\(N_=(\empty)=\sum\limits_{j=0}^n (-1)^j \sum\limits_{J\in\binom{\mathscr{A}}{j}} (n-j)^k=\sum\limits_{j=0}^n (-1)^j \dbinom{n}{j} (n-j)^k\)

综上有\(\left\{\begin{array}{l} k \\ n \end{array}\right\}=\dfrac{1}{n!}\sum\limits_{j=0}^n (-1)^j \dbinom{n}{j} (n-j)^k\)

二分图完美匹配

通过邻接矩阵,完美匹配的方案数可以写成积和式\(\text{perm}A=\sum\limits_{\sigma}\prod\limits_{i=1}^{n}A_{i,\sigma(i)}\)。复杂度\(O(n! \cdot n)\)

利用容斥原理,把右侧的节点\(i\)没有被匹配上看作坏事件\(A_i\),那么\(N_\geq(J)=\prod\limits_{i=1}^{n}\left(\sum\limits_{j \in [n] \backslash J}A_{i,j}\right)\)。于是有\(N_=(\empty)=\sum\limits_{J\in\mathscr{A}}(-1)^{|J|} \prod\limits_{i=1}^{n}\left(\sum\limits_{j \in [n] \backslash J}A_{i,j}\right)\)。复杂度由枚举全排列转化为了枚举子集,复杂度\(O(2^n \cdot n)\)。可以证明,在渐进意义下这是最优复杂度了。

posted @ 2023-02-27 15:55  DennyQi  阅读(233)  评论(0编辑  收藏  举报