参考资料:论文集2015《集合幂级数的性质及其快速算法》吕凯风

从子集卷积开始

两个序列 (当然,以集合为下标)的子集卷积

它是非常重要的集合卷积;事实上它可能是最重要的集合卷积。

我们都知道它的经典 算法:考虑把 卷积到 上,这样 显然一定是两个不相交的 卷出来的,否则第一维一定会比 大。

显然就是普通的序列卷积,这提示我们定义如下的

集合占位幂级数

定义 集合占位幂级数,如果任意 是一个形式幂级数,且对于 ,同时有

我也知道乱改论文里的符号不太好,但是在右下角标里写太多东西就是让我很难受……

显然对于 我们完全不关心。大概这就是占位罢(。显然集合占位幂级数的如下定义的卷积

就是子集卷积。

实现方法就是之前提到的经典算法,不再赘述。

接下来我们简称集合占位幂级数为集合幂级数。

集合幂级数求逆

此处指的是子集卷积意义下的逆。显然子集卷积意义下的乘法单位元就是

回想子集卷积,我们只是单纯地 or_FWT 后把对应位置的集合幂级数相乘。从而有

于是我们把 (是一个形式幂级数)挨个求逆然后 回去即可。从而也可以看出集合幂级数 有逆当且仅当

由于 一个集合幂级数是 的,所以时间复杂度瓶颈并不在求逆上,可以使用简单常数小的暴力 求逆。

集合幂级数 Exp 和 Ln

考虑如下定义的 Exp:

从而,由于 有线性和积性, 有线性,我们可以得到

某种意义上说:

从而只需要 - 对每个形式幂级数求 - 即可。

完全类似。

同样,由于对形式幂级数的操作并非时间复杂度瓶颈,从而可以使用暴力 算法。

参考代码

虽然集合占位幂级数一看就让人很有封装的欲望,但是不仅没有封装的必要而且一旦封装还会让你的常数起飞……

劲爆应用

欧拉生成子图个数

题面完全没有体现出要求的是生成子图啊……

考虑计算点度均为偶数的生成子图个数。暴力枚举点集,于是得到一个异或方程组,解数即偶子图个数。抽出其中的线性基,其他边均可随意选或不选。

然后集合幂级数 即可。

复杂度

注意 体现的重要组合意义: 会把 拆解成不能再拆解的形式,因为它是 ,即完全任意组合的逆运算。Exp 组合意义的名字是 x义x 乱取的,不要在意

点双连通生成子图计数

我们都知道点/边双是和连通有某种容斥关系的。在生成子图问题中我们仍然可以类推。具体来讲:

首先我们可以算出连通生成子图的集合幂级数 。这个很显然,生成子图的集合幂级数 一下即可。

为所有割点编号都大于等于 的连通生成子图的集合幂级数。考虑从 推到 。也就是要去除所有 是其割点的图:删去 后变为多个 (你可能会想不应该是 吗,但是这些图本来就不含 不影响它们)的图。

但是这怎么列式子呢,你可以看看大概长这样的一个图

于是我们得到

其中 是强制把不包含 的位置置 0 得到的集合幂级数。

建议细品。理解这个完全基于点的容斥的处理边的方式是不太容易的。关注处理连通性的方式:这里用 把连通块“缝”了起来。上面的变换也和 Exp 有了很大差别,不如称为“连通组合”?

复杂度 。你可能会很惊讶,这玩意不是 的吗,是怎么过的呢,小编也很惊讶,但事实就是这样。

彩蛋

边双连通生成子图计数

啊这,边的限制……这就很难搞了。我们必须想个办法把它变成点。

边双的每一条边都包含在至少一个环里。环意味着什么?点双连通分量。

也就是说,每一个有边的点对都包含在一个更大的点双里。边双连通图就是没有大小为 2 的点双连通分量的图

注意大小为 2 的点双连通分量是不可(按上面的方式)拆解的。

我们考虑先求出点双的集合幂级数,然后挖掉所有的大小为 2 的位置,记为 ,再一步步把它“组装”回去。令 是允许编号小于等于 的节点成为其割点的答案。如果你真的认真考虑过了上面两个问题,你应该能轻松写出

复杂度

彩蛋

Tutte 多项式

一个无向图 的 Tutte 多项式定义为

我们先考虑计算连通的 ,之后再 Exp 上去。

是所有使 连通的 之和。考虑加一个节点 。设 之间的边数为 。则如果加入 则应该乘的是

可以发现如果新的连通块是由多个 拼成,那么只需要对每个 分别乘这个东西就好了。那么暴力把 全都加进去就做完了。复杂度

注意 的情况。

彩蛋

生成仙人掌计数

还是考虑加入一个点 。观察一下 的“子节点”:

那么我们设 是点集为 的仙人掌,而且删掉 还是仙人掌的数量,从而答案就是

经验告诉我们应该分别讨论单纯的点和环两种情况。设前一种为 表示儿子为 ,后一种为 表示 在环上的“下一个点”是 ,显然 会因此算两遍。然后还要特判只有 的迫真环,从而有

非常的简单,它只要求 有边,而且 是一个仙人掌。

接下来考虑 是由一串仙人掌串在一个环上,不妨修改 的定义:不再要求 有边,我们只是简单地把仙人掌串到了 处。也不妨利用一下 ,它也不再要求 有边。最后统计的时候强行要求即可。

(↑ 请注意实际上 的“占地”并不包含 ,图中只是为了方便理解)

于是可以写出

初值为 。考虑

于是从较低的 推上去即可。时间复杂度为

彩蛋

upd 2020/11/11

注意到只需要承认一条边是一个长度为 2 的环,此时仙人掌就是环套在一起,立即得到一个好写的做法。

后记

是不是什么图计数题都可以搬到集合幂级数上啊(

生 成 烷 烃(错乱)