子集反演学习笔记

子集反演

定义 \([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]\)

\(f_n(S)\):有多少个 \(n\) 个点的 DAG,使 \(S\) 中的点入度为 \(0\)

\(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)\) 转移了。

posted @ 2024-01-20 13:42  rlc202204  阅读(21)  评论(0编辑  收藏  举报