子集反演学习笔记

· · 个人记录

子集反演

定义 [x] 表示集合 \{i|1 \le i \le x, i \in \mathbb{Z^*}\}

S \subset [n]。有:

f(S)=\sum_{T \subset S}g(T) \iff g(S)=\sum_{T \subset S}(-1)^{|S|-|T|}f(T) f(S)=\sum_{T \supset S}g(T) \iff g(S)=\sum_{T \supset S}(-1)^{|T|-|S|}f(T)

证明:

只证明第一个式子,第二个与第一个类似。

\begin{aligned} \sum_{T \subset S}(-1)^{|S|-|T|}f(T) &= \sum_{T \subset S}(-1)^{|S|-|T|}\sum_{Q \subset T}g(Q)\\ &= \sum_{Q \subset S}g(Q)\sum_{Q \subset T \subset S}(-1)^{|S|-|T|}\\ &= \sum_{Q \subset S}g(Q)\sum_{T \subset (S / Q)}(-1)^{|S / Q|-|T|}\\ \end{aligned}

观察 \sum_{T \subset (S / Q)}(-1)^{|S / Q|-|T|} 发现当 S / Q = \emptyset 时为 1,否则为 0。两两配对可以证明。

所有除了 S = Q,其它的都是 0,所以原式就等于 g(S),得证。

应用

子集反演的核心:包含与恰好之间的转化

问题: m 个数 p_1 \sim p_m,求 1 \sim n 中多少个数被奇数个 a_i 整除。

思路:

S \subset [m]

f(S)=|{\{x | 1 \le x \le n, \forall i \in S,p_{i}|x\}}| g(S)=|{\{x | 1 \le x \le n, \forall i \in S,p_{i}|x,\forall i \not \in S,p_i \not | S}\}|

答案就是 \sum_{|S| \bmod 2 = 1}g(S)

但是 g 不好求,但是 f 很好求,容易得到:

f(S)=\frac{n}{\prod_{i \in S}p_i}

我们考虑用 f 表示 g

根据定义,可以得到:

f(S)=\sum_{S \subset T}g(T)

然后子集反演,得到:

g(S) = \sum_{S \subset T}(-1)^{|T| -|S|}f(T)

这样就可以求出 g 了。

但是还可以更进一步,我们将结果代入答案中得到:

\begin{aligned} \sum_{|S| \bmod 2 = 1}g(S) &= \sum_{|S| \bmod 2 = 1}\sum_{S \subset T}(-1)^{|T| -|S|}f(T)\\ &= \sum_{|S| \bmod 2 = 1}\sum_{S \subset T}(-1)^{|T| + |S|}f(T)\\ &= \sum_{T\not = \emptyset}f(T)\sum_{|S| \bmod 2 = 1,|S| \subset T}(-1)^{|T| + |S|}\\ &= \sum_{T\not = \emptyset}f(T)\sum_{i=1}^{\lceil \frac{|T|}{2}\rceil}\binom{|T|}{2i-1}(-1)^{|T|+2i-1}\\ &= \sum_{T\not = \emptyset}f(T)(-1)^{|T|-1}\sum_{i=1}^{\lceil \frac{|T|}{2}\rceil}\binom{|T|}{2i-1}\\ \end{aligned}

\sum_{i=1}^{\lceil \frac{|T|}{2}\rceil}\binom{|T|}{2i-1} 其实就等于 2^{|T|-1},也就是 |T| 的子集中刚好大小为奇数和偶数的各占一半。

经过化简,最终得到:

\sum_{T\not = \emptyset}f(T)(-2)^{|T|-1}

然后做完了。

问题:n 个点有标号的 DAG 个数。

思路:

S \subset [n]

$g_n(S)$:有多少个 $n$ 个点的 DAG,使只有 $S$ 的点入度为 $0$。 可以得到: $$ f_n(S)=\sum_{S \subset T}g_n(T) $$ 所以: $$ g_n(S) = \sum_{S \subset T}(-1)^{|T| -|S|}f_n(T) $$ 首先,我们可以得到: $$f_n(S)=2^{|S|(n-|S|)}f_{n-|S|}(\emptyset)$$ 将所有点分成两部分,$S$ 只能往外连,剩下的内部连。 我们最后要求的应该是 $f_n(\emptyset)$。 结合上面的式子,我们可以得到: $$ \begin{aligned} f_n(\emptyset) &= \sum_{T}g_n(T)\\ &= \sum_{T \not= \emptyset}g_n(T)\\ &= \sum_{S \not= \emptyset}\sum_{S \subset T}(-1)^{|T|-|S|}f(T)\\ &= \sum_{S \not= \emptyset}\sum_{S \subset T}(-1)^{|T|+|S|}2^{|T|(n-|T|)}f_{n-|T|}(\emptyset)\\ &= \sum_{T \not= \emptyset}[\sum_{S \subset T,S \not= \emptyset}(-1)^{|S|}](-1)^{|T|}2^{|T|(n-|T|)}f_{n-|T|}(\emptyset)\\ &= \sum_{T \not= \emptyset}(-1)(-1)^{|T|}2^{|T|(n-|T|)}f_{n-|T|}(\emptyset)\\ &= \sum_{T \not= \emptyset}(-1)^{|T|+1}2^{|T|(n-|T|)}f_{n-|T|}(\emptyset)\\ &= \sum_{k=1}^n\binom{n}{k}(-1)^{k+1}2^{k(n-k)}f_{n-k}(\emptyset) \end{aligned} $$ 这样就可以 $O(n^2)$ 转移了。