我们如何解决求子集团个数

题面

方法一

首先预处理每个子集是否成团,然后枚举子集即可 \(O(3^n+n2^n)\)

方法二

考虑 meet in the middle,左侧处理处每个子集是否成团,右侧处理每个子集是否成团,然后枚举其子集成团数量,最后在枚举左侧合法子集,贡献是这个子集关于右侧集合的合法集合的子集成团数量,你可以左侧开大一点,右侧开小一点 \(O(x2^x+3^{n-x}+(n-x)2^{n-x})\),其中 \(x\) 自选。

方法三

考虑优化右侧枚举子集。如果设计 \(f_i\) 表示集合 \(i\) 的合法子集数量, \(to_i\) 表示 \(i\) 的连通集,那么我们发现如下方程:

\[f_i = f_{i\nmid j}+f_{(i\nmid j)\&~to_j} \]

所以就可以 \(O(\frac{n}{2}2^{\frac{n}{2}})\) 做了。

posted @ 2025-10-30 10:08  NeeDna  阅读(5)  评论(0)    收藏  举报