集合幂级数学习笔记
一、集合幂级数基础
类比形式幂级数将序列对应为一个多项式,我们可以用类似的方法,把一个集合及其所有子集变为一个多项式的形式,对于集合 \(U\) 标准形式如下:
这里 \(x^S\) 只是一个占位符,就像形式幂级数的 \(x^i\) 一样。
加减法
集合幂级数的加减法很简单,就是对应位置相加,即:
乘法
类比一般多项式乘法,有:
其中 \(*\) 是集合间的一种二元运算,并使得 \(*\) 有交换律,结合律,以及单位元 \(\emptyset\)。
常见的 \(*\) 有 集合并,集合交,集合对称差,子集卷积。
二、分治解法
集合并卷积
令 \(*\) 为 \(\cup\) ,则有:
暴力进行复杂度 \(\mathcal O(4^n)\)。
集合对称差卷积
定义集合上的二元运算 $\oplus $ 表示 \(A\oplus B=\{x|(x\in A)\oplus (x\in B)\}\) 后者的 \(\oplus\) 表示异或运算。
则有:
集合交卷积
类似,咕了。
三、快速沃尔什变换/快速莫比乌斯变换
算了我觉得 Alex_Wei 老师写太好了,我太懒了所以就不写了直接写应用吧。
四、性质
- \(\prod f=I(\prod T(f))\) ,这是因为集合卷积不会改变集合大小,而多项式乘法会让下标变大所以每次 FFT 乘法后要马上 IFFT 回来。
- FWT 有线性性,即 \(T(\sum_ic_if_i)=\sum_ic_iT(f_i)\)
五、应用
下文中 \(T()\) 表示快速沃尔什变换,\(I()\) 表示快速沃尔什逆变换。\(T^i,\prod T,\prod \hat f\) 表示对变换后的结果的每一位的值普通乘法。\(f^i,\prod f\) 表示卷积。
AT_abc212_h [ABC212H] Nim Counting - 洛谷
基础应用。
对每一堆石子生成函数有:\(f=\sum_{S}[S\in\{A\}]x^S\)
答案为:\(\sum_{i=1}^nf^i\) 中非 \(x^{\emptyset}\) 项之外的系数之和。
那么有 \(\sum_{i=1}^nf^i=\sum_{i=1}^nI(T^i(f))=I(\sum_{i=1}^nT^i(f))\)。
其中第二个等号成立是因为 FWT 有线性性。于是用等比数列求和公示可以解决。
CF449D Jzzhu and Numbers - 洛谷
对每个数生成函数有 \(f_i=x^{a_i}+x^U\),其中 \(U=2^{20}-1\) 即全集。那么答案为 \([x^{\emptyset}]\prod f_i\) 其中 $\prod $表示集合交卷积。
有:\([x^{\emptyset}]\prod f_i=[x^{\emptyset}]I(\prod T(f_i))=[x^{\emptyset}]I(\sum_{S}\prod \hat f_{i,S})\) 但是这样直接计算是 \(\mathcal O(n^2)\) 的。
我们知道集合交卷积的 FMT 本质是高维后缀和,那么 \(\hat f_{i,S}=[S\subseteq a_i]+1\) 所以 \(\prod \hat f_{i,S}=2^{\sum_{i}[S\subseteq a_i]}\) 这里我们直接令 \(g_S\) 表示 \(S\) 在 \(\{a_i\}\) 中出现的次数然后求一个 FMT 就变成了 \(\sum_{i}[S\subseteq a_i]\),即 \(\prod \hat f_{i,S}=2^{\hat g_S}\) 于是可以一次 FMT 加一次 IFMT 解决这道题。
CF662C Binary Table - 洛谷
注意到 \(n\) 很小,\(m\) 很大,有一种暴力的方法是枚举每行翻不翻转,然后对于每一列贡献 \(0/1\) 数量较少的那个个数。
翻转后的状态由初始状态与翻转操作状态异或得来
设第 \(i\) 列的初始状态为 \(a_i\),形式化的式子为:\(\min_x\{\sum_{i}g_{x\oplus a_{i}}\}\) 其中 \(g_s\) 表示 \(s\) 中 \(01\) 个数的较小值。
由于 \(i\) 与位置有关,\(x\) 与值有关,不好处理,令 \(c_i\) 表示状态 \(i\) 在 \(\{a\}\) 中出现的次数,答案转化为:\(\min_x\{\sum_{i}c_ig_{i\oplus x}\}\) 发现 \(\min\) 里面就是一个子集卷积。没发现?没关系,令 \(j=i\oplus x\),\(f_x=\sum_{i}c_ig_{i\oplus x}\),有 \(f_{i\oplus j}=\sum_{i}c_ig_j\) 那么这用个集合对称差卷积可以求出所有的 \(f_x\) 最后取最小值即可。
复杂度 \(\mathcal O(n^22^n+m)\)。
AT_abc288_g [ABC288G] 3^N Minesweeper - 洛谷
这道题设计 FWT 的一个核心思想——各位独立。
类比在推 \(\hat f_i=\sum_{j=0}^{2^k-1}C(i,j)f_j\) 的时候将 \(C(i,j)\) 拆做 \(\prod _{i=0}^{k-1}c(i_k,j_k)\),其中 \(i_k\) 表示 \(i\) 在二进制下的第 \(k\) 位。 这道题本来有 \(A_i=\sum_{j=0}^{3^n-1}C(i,j)B_j\),但是 \(C(i,j)\) 的限制也是独立的,于是同样令 \(C(i,j)=\prod c(i_k,j_k)\)。我们考虑求出矩阵 \(c\) 的值。因为:
求出 \(c=\begin{bmatrix}1&1&0\\1&1&1\\0&1&1\end{bmatrix}\),直接算出 \(c^{-1}=\begin{bmatrix}0&1&-1\\1&-1&1\\-1&1&0\end{bmatrix}\)。用IFWT的方式可以算出 \(\{B\}\)。
CF1119H Triple - 洛谷
这是一类求 \(\prod_{i=1}^n\sum_{j=1}^{k}w_jx^{a_{i,j}}\) 的值的方法,其中 \(\prod\) 为集合对称差卷积。即非 \(0\) 项系数相同但是位置不同。本题为 \(k=3\) 的特例。
首先 \(\prod_{i=1}^n\sum_{j=1}^{k}w_jx^{a_{i,j}}=I(\prod_{i=1}^nT(\sum_{j=1}^{k}w_jx^{a_{i,j}}))\)
根据 FWT 的变换式,\(\forall S,[x^S]\sum_{j=1}^{k}w_jT(x^{a_{i,j}})\) 总共有 \(2^k\) 中可能的取值,即:\(\sum_{j=1}^k \pm w_i\),现在我们想对于每种取值求出其出现次数。
令 $T\subseteq {1,2,\cdots k} $,且若 \(T\) 的第 \(i\) 位为 \(0\) 就令 \(w_i\) 的系数为\(1\) 否则为 \(0\) 。每种状态看作集合 \(T\),令其出现次数为\(c_{S,T}\)。
令 \(G_T=\sum_{i=1}^nx^{\bigoplus_{j\in T} a_{i,j}}\),考虑 \([x^S]FWT(G_*)\) 与 \(c_{S,*}\) 的关系,应该有 \(FWT(G_T)=\sum_{V}C(T,V)c_V\) 讨论其系数发现 \(C(T,V)=(-1)^{|T\cap S|}\) 这与 FWT 的 系数正好相同。即\([x^S]FWT(G_*)\) 是 \(c_{S,*}\) 的 FWT,想求 \(c\) 就对 \(T\) 进行 IFWT 就行了。
复杂度 \(\mathcal O(n2^k+2^{m+k})\),其中 \(m\) 表示 \(a_{i,j}\) 表示的集合大小,即 \(a_{i,j}\in\{0,1,\cdots 2^m-1\}\)
P4221 [WC2018] 州区划分 - 洛谷
半半在线子集卷积模板
由于子集卷积 \(f_S=c_S\sum_{T\subseteq S,T\ne \emptyset}f_{S\setminus T}g_T\) 中 \(|T|<|S|\),所以完全可以仿照普通子集卷积的方式按照 \(|S|\) 的大小转移。
参考
集合幂级数相关 - qAlex_Weiq - 博客园
集合幂级数 - 题单 - 洛谷 | 计算机科学教育新生态
题解 CF1119H 【Triple】 - 洛谷专栏
CF1119H Triple - 洛谷专栏