[转载] 容斥原理
容斥原理
给定一个 \(n\) 个元素的集合 \(N\),对于一个函数 \(f: 2^N \to R\),以及子集和函数 \(f\zeta\)
我们现在知道 \(f\zeta\),想还原出 \(f\),那么有以下公式
证明:
如果把上面每个集合换成它的补集,那么可以得到另一种形式。
给定一个 \(n\) 个元素的集合 \(N\),对于一个函数 \(f: 2^N \to R\),以及超集和函数 \(\zeta f\)
我们现在知道 \(\zeta f\),想还原出 \(f\),那么有以下公式
实际应用通常是以下的场景:现在有一些对象 和 与它们相关的 \(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 反演,背后有着一套通用理论。(大概吧)\)