[转载] 容斥原理

容斥原理

给定一个 \(n\) 个元素的集合 \(N\),对于一个函数 \(f: 2^N \to R\),以及子集和函数 \(f\zeta\)

\[f\zeta(S)=\sum_{T\subseteq S}f(T) \]

我们现在知道 \(f\zeta\),想还原出 \(f\),那么有以下公式

\[f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f\zeta(T) \]

证明:

\[\begin{aligned} &\textcolor{white}{=}\sum_{T\subseteq S}(-1)^{|S|-|T|}f\zeta(T) \\ &=\sum_{T\subseteq S}(-1)^{|S|-|T|}\sum_{U\subseteq T}f(U) \\ &=\sum_{U\subseteq S}f(U)\sum_{U\subseteq T\subseteq S}(-1)^{|S|-|T|} \\ &=\sum_{U\subseteq S}f(U)[U = S] \\ &=f(S) \end{aligned} \]

如果把上面每个集合换成它的补集,那么可以得到另一种形式。

给定一个 \(n\) 个元素的集合 \(N\),对于一个函数 \(f: 2^N \to R\),以及超集和函数 \(\zeta f\)

\[\zeta f(S)=\sum_{S\subseteq T}f(T) \]

我们现在知道 \(\zeta f\),想还原出 \(f\),那么有以下公式

\[f(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}\zeta f(T) \]

实际应用通常是以下的场景:现在有一些对象 和 与它们相关的 \(n\) 个命题。根据每个命题是否为真,可以分为 \(2^n\) 类。

我们把 \(N\) 的每个元素和一个命题关联上,这样一个子集 \(S\) 就对应着一类对象。我们让 \(f(S)\) 统计这些对象。

一个对象只可能在一个集合中被统计。\(f(S)\) 统计的对象满足 \(S\) 集合里这些命题,而不满足其他所有命题。

我们能求的只有 \(f\zeta(S)\):只知道 \(S\) 以外的命题为假,而不知道 \(S\) 中的命题的情况。

或者,我们能求的只有 \(\zeta f(S)\):只知道 \(S\) 中命题为真,而不知道 \(S\) 以外的命题的情况。

这样我们就可以用容斥原理还原出 \(f(S)\)

举个群里提到的例子:喜欢数学的有 \(x\) 人,喜欢英语的有 \(y\) 人,两者都喜欢的有 \(z\) 人。问喜欢数学或英语的有多少人。

这里统计的对象是人,命题是 喜欢数学 或 喜欢英语,\(f\{数学\}\) 表示只喜欢数学的人数,\(f\{英语\}\) 表示只喜欢英语的人数,\(f\{数学, 英语\}\) 表示喜欢数学也喜欢英语的人数,按照题意没有人两者都不喜欢,所以 \(f\{\}=0\)

按照容斥原理,我们可以写出式子 \(f\{\} = \zeta f\{\} - \zeta f\{数学\} - \zeta f\{英语\} + \zeta f\{数学, 英语\}\)。即 \(0 = \zeta f\{\} - x - y + z\)\(\zeta f\{\} = x + y - z\)。所有子集都是空集的超集,所以 \(\zeta f\{\}\) 统计了所有人,正是我们想要的答案。

再举个实际例子,从高维前缀和还原出 \(a_1, a_2, \dots, a_n\) 处的单点值。对象是所有点 \(x_1, x_2, \dots, x_n\),其中 \(x_i \leq a_i\)。全集 \(N\) 的第 \(i\) 个元素对应命题 \(x_i = a_i\),如果不满足,说明 \(x_i \leq a_i - 1\)。这样 \(f\zeta\) 的限制要么是 \(x_i \leq a_i - 1\),要么没有特殊要求(即 \(x_i \leq a_i\)),直接套用容斥原理即可。

\(% 容斥原理可以说是子集格上的 Möbius 反演,背后有着一套通用理论。(大概吧)\)

posted @ 2021-12-22 15:11  HN-wrp  阅读(3)  评论(0编辑  收藏  举报