📜  不是任何其他给定列表的子集的列表的计数(1)

📅  最后修改于: 2023-12-03 15:35:55.202000             🧑  作者: Mango

不是任何其他给定列表的子集的列表的计数

假设有一个由 $n$ 个元素组成的集合 $S$,以及 $m$ 个不同的集合 $A_1, A_2, \dots, A_m$,每个集合都由 $S$ 的一些子集组成。问题是:有多少个 $S$ 的子集不是任何 $A_i$ 的子集?

这个问题可以用容斥原理来解决。首先,我们需要定义集合 $A_{i_1, i_2, \dots, i_k}$,表示 $A_{i_1}, A_{i_2}, \dots, A_{i_k}$ 的交集,其中 $k$ 是一个正整数,$1 \leq i_1 < i_2 < \dots < i_k \leq m$。进一步地,我们定义 $f(T)$ 表示 $S$ 的子集 $T$ 中,至少包含一个 $A_i$ 的子集的个数。显然,我们有:

$$ f(T) = \sum_{i=1}^m [T \cap A_i \neq \varnothing] $$

其中 $[P]$ 表示当条件 $P$ 成立时为 $1$,否则为 $0$。

现在,我们可以使用容斥原理来计算我们做这个问题时不感兴趣的部分:$S$ 的所有子集中,至少是某个 $A_i$ 的子集的子集的数量。令 $g(T)$ 表示 $S$ 的子集 $T$ 中,是至少是某个 $A_i$ 的子集的子集的个数。我们有:

$$ g(T) = \sum_{k=1}^{m} (-1)^{k-1} \sum_{1 \leq i_1 < i_2 < \dots < i_k \leq m} [T \subseteq A_{i_1, i_2, \dots, i_k}] $$

这里,$T \subseteq A_{i_1, i_2, \dots, i_k}$ 表示当且仅当 $T$ 是 $A_{i_1}, A_{i_2}, \dots, A_{i_k}$ 的交集的子集时为真。通过容斥原理,我们可以得到:

$$ |S| - g(S) = \sum_{T \subseteq S} (-1)^{|T|} g(T) $$

其中,$|T|$ 表示集合 $T$ 中元素的个数。因为 $g(S)$ 表示 $S$ 的所有子集中,至少是某个 $A_i$ 的子集的子集的数量,所以 $|S| - g(S)$ 就是我们最终要得到的答案:$S$ 的所有子集中,不是任何 $A_i$ 的子集的子集的数量。

为了计算 $g(S)$ 和 $g(T)$,我们可以使用一些预处理技巧,使得计算复杂度降至 $O(3^m)$。一种方法是使用状压 DP,另一种方法是使用 Moebius 反演公式。具体细节超出了这篇文章的范围,有兴趣的读者可以自行参考相关资料。

参考资料:

  • [Blog] How many subsets of a set do not contain any subset from a given family? by Alexey ‘fenixfeather’ Prelestnikov
  • [Blog] Counting Subsets by Benq