集合幂级数总结

定义集合幂级数:集合幂级数是一个形式幂级数,它的每一项的指数都是集合。

它有几种乘法:子集卷积,xor卷积,and卷积,or卷积,其中前两者最有用。

fwt的几条重要性质:它的直接定义式可以考虑变换的过程求出。它是线性变换(和的fwt=fwt的和)。fwt的逆变换要乘的矩阵就是原变换矩阵的逆矩阵。如果要乘法,则可以fwt后点乘。

定义子集卷积:f[s|t]+=a[s]*b[t](s&t==0)

这样子直接做是O(3^n)的

但是可以使用占位多项式优化。

设f[i][s],f[i][s]只有当i=bitcount(s)时为a[s],否则为0

f[x+y][]+=a[x][]*b[y][]

如果设s的1位数位x,t的为y

则x+y=bitcount(s|t)等价于s&t=0

所以可以对f[i][]作高维前缀和(原因后面再讲),再进行点乘。

这样子时间复杂度是2^n*n^2的

实际上,发现f[][j],每一个j在做完后是独立的,f[i][]构成了2^n个多项式。

这带给了一些优美的性质。

f[][j]的求逆可在2^n*n^2的时间复杂度内完成,对每个多项式求逆即可。

定义幂级数的导数为$x^S=bitcount(s)x^{s-{t}}$ t为任意集合。

发现这个导数的定义满足导数的性质。但是定义积分是困难的。

只要作高维前缀和,就可以快速计算导数(就是占位多项式的前一位),同时推出集合幂级数求ln,exp的做法。

化集合幂级数的方法和化简生成函数的方法有点像。通常有化为点乘,取系数,两端xor/or/and卷积几种方法。

例题:

ZJOI2019 开关

at4996 agc034f

uoj94

noio r3 优秀子序列

原文地址:https://www.cnblogs.com/cszmc2004/p/12886248.html