容斥原理
我咋菜成这个样子了?
我们有一些方案,同时给定给定 \(n\) 种限制,对于每一种方案 \(P\),他会满足其中的一些限制而不满足其余的。现在给定一个条件子集 \(S \subseteq \{1,2, \cdots \cdots,n\}\),请问恰好满足 \(S\) 中的条件而不满足其余条件的方案有多少种。
这种问题是非常经典的,而对于这种问题我们称之为精确控制问题。我们考虑设最终的答案为 \(g_S\)。但是在通常情况下 \(g_S\) 是十分不好求的。
不过此时我们考虑另一种问题:
我们有一些方案,同时给定给定 \(n\) 种限制。现在给定一个条件子集 \(S \subseteq \{1,2, \cdots \cdots,n\}\),请问恰好满足 \(S\) 中的条件而其余条件没有要求的方案有多少种。
此时我们称这种问题为部分满足问题。此时记着这种问题的答案为 \(f_S\)。那么容易得到:
\[f_S = \sum_{S \subseteq T \subseteq U} g_T
\]
其中 \(U = \{1,2, \cdots \cdots,n\}\)。同时我们发现:
\[g_S = \sum_{S \subseteq T \subseteq U} (-1)^{|T| - |S|} f_T
\]
那么在知道 \(f_S\) 之后我们就可以反推回 \(g_S\) 了。
而大家所熟知的二项式反演也就是容斥原理的一种特例,即 \(U\) 中所有的元素是等价的,即 \(f_S\) 之和 \(|S|\) 有关。然后将之前的式子化简并且改写一下就可以得到二项式反演的式子了。
所以总结一下,做容斥的步骤就分为了:
- 确定全集 \(U\) 和要求的 \(g_S\)。然后再定义 \(f_S\)。
- 求出 \(f_S\)。
- 根据求出的 \(f_S\) 和反演公式求出答案 \(g_S\)。

浙公网安备 33010602011771号