集合幂级数学习笔记

集合幂级数

定义与 FWT

类似于形式幂级数,
对于一个全集,我们定义集合幂级数 F(x)=sUfsxs
我们可以用一个长为 |U| 的 2 进制数表示一个集合,集合的并、交、对称差分别对应二进制数的 ,,

我们可以定义集合幂级数的并卷积、交卷积、对称差卷积:

ck=ij=kaibjck=ij=kaibjck=ij=kaibj

我们思考我们熟知的形式幂级数 max,min 以及循环卷积的快速做法,对需要卷积的两个序列的系数施以一个合适的线性变换,进行点积,再进行逆变换得到答案。(三种卷积的线性变换分别是前缀和,后缀和,DFT)

由于对于 ,, 来说按位独立,我们考虑将一个 |U| 位 2 进制数看成 |U| 维向量,我们可以将原本的集合幂级数看成 |U| 元的形式幂级数:x1,x2,,x|U|fsx1s1x2s2x|U|s|U|
那么集合幂级数的三种卷积就是对 |U| 元都做 max,min 以及循环卷积的结果。

我们可以得到 3 种 FWT 的线性变换:

并卷积:f^i=ji=jfj
交卷积:f^i=ji=jfj
异或卷积:f^i=j(1)popcnt(ij)fj

FWT 的应用

使用 FWT 可以高效的处理集合幂级数卷积,有一些经典的技巧值得注意。

例 1

考虑求解集合幂级数 i=1n(1+xai)(异或卷积)。

我们可以直接考虑 1+xp 这样的式子 FWT 后的形式,即 f^i=1+(1)popcnt(ip)
那么 f^i 只有两种取值:0 或 2。我们如果知道 n 个二项式 FWT 后的结果有多少个 0,2,那么这 n 个值乘起来后的结果也唾手可得,再进行一次 IFWT 即可得到答案。

我们考虑统计 j=1n(1)popcnt(iaj) 即可解得 0,2 的个数。使用 FWT 计算该式即可。

子集卷积

单纯的并、交、对称差卷积可能并不够用,存在一些特别的问题可以抽象成子集卷积的形式。
我们定义子集卷积:

ck=ij=k,ij=0aibj

考虑通过扩元转化成我们已知的卷积。

F(x,y)=sfsxsy|s|,定义 x 元做并卷积,y 做加法卷积,那么子集卷积出的形式幂级数取 C(x)=[y|s|]F(x,y) 即可。
由于每一元独立,我们考虑先对 x 元做 FWT 变换,直接处理 y 元的加法卷积,最后对 x 元逆变换回来即可。
时间复杂度 O(2nn2)

子集卷积意义下的初等函数

对于 f0=0 的集合幂级数,在子集卷积意义下可以定义 exp,我们将并卷积意义下的集合幂级数看成黑盒,由于其有乘法,乘常数,和普通加法卷积意义下形式幂级数一样考虑 exp 就行了。

具体的,将子集卷积中间处理 y 元的加法卷积的部分,改成处理 exp 的部分即可,ln 同理,均可以做到 O(2nn2)

可以以一道例题理解其组合意义:给定一个无向图,求其每个子集的划分成若干独立集的方案数。
fs 表示集合 s 是否为独立集,那么对其做子集卷积意义下的 exp 运算得到的集合幂级数就是答案。

posted @   juju527  阅读(157)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示