Set Power Series

集合幂级数及其运算

集合幂级数

对于实值函数 \(f:U\rightarrow R\), 定义集合幂级数\(F(z)=\sum_Sf(S)z^S\), 其中\(z^S\)满足\(z^S\cdot z^T=z^{S\cup T}\).

位运算卷积

FMT (子集求和)

按位分治

1
2
3
4
for (int i = 1; i < N; i <<= 1)
for (int j = 0; j < N; j += i * 2)
for (int k = j; k < i + j; ++k)
f[k+i] += f[k];

FMT 满足如下性质:

  1. \(FMT(A)+FMT(B)=FMT(A+B)\)
  2. \(FMT(A_B)=FMT(A)\cdot FMT(B)\), 其中\([A_B]_i=\sum_{k|j=i}A_kB_j\)

### IFMT (子集差分)

FMT 的逆运算

1
2
3
4
for (int i = 1; i < N; i <<= 1)
for (int j = 0; j < N; j += i * 2)
for (int k = j; k < i + j; ++k)
f[k+i] -= f[k];

集合幂级数运算

集合幂级数按占位拆分

\(F_i(z)=[u^i]\sum_Sf(S)z^Su^{|S|}\)

子集卷积

\(H(z)=\sum_{S\cap T=\emptyset}[z^S]F(z)\cdot [z^T]G(z)z^{S\cup T}\)

注意集合不交的条件, 可以改成\(|S|+|T|=|S\cup T|\), 于是利用占位幂级数进行运算即可.

\[ \begin{aligned} H_k(z)&=\sum_{i+j=k}F_i(z)G_j(z)\\ FMT(H_k)&= \sum_{i+j=k}FMT(F_i)FMT(G_j)\ \end{aligned} \] 交换求和次序, 对\(FMT\)数组的每一项独立计算.

\(f_S(z)=\sum_k [FMT(F_k)]_Sz^k\), 子集卷积实际上是 \(h_S(z)=f_S(z)g_S(z)\).

其他运算

\(\exp\), \(\ln\), 求逆, 多项式复合等运算, 和刚才的分析同理. 对每一项占位多项式进行对应的操作即可.

note: exp将联通图转化为有多个联通分量的图, ln作为逆运算反之.

关于半在线/在线卷积

注意到\(O(n^2)\)递推的方向是集合大小不断增加, 下一层的值由前面层的答案组成, 天然支持在线.

Eg

https://loj.ac/p/6719

https://loj.ac/p/6729

https://loj.ac/p/6730

https://loj.ac/p/2340