集合幂级数感性学习笔记
集合幂级数的性质真的太美了。这里简要记录一些操作。
下文若无特殊说明集合幂级数间乘法定义为集合不交并卷积(子集卷积)。
对于集合不交并卷积,常见的处理方法是设出占位多项式,对两维分别卷积。实际上这两维是十分独立的,类似于二元生成函数的两个形式幂。因此针对集合幂级数进行的运算,由于我们在占位维上的运算就是普通卷积,所以可以直接每个占位维 FWT 或卷积完后做数列意义上的各种运算。
求逆
设集合幂级数 \(F\),其乘法逆定义为集合幂级数 \(G\) 使得 \(F\cdot G = x^{\empty}\)。根据暴力求逆公式,我们有:
边界 \(g_{0} = \dfrac{1}{f_0}\)
例题
你有一个 \(n\) 个节点的有向图,我们称一个合法的方案是将其中一些边的方向翻转之后使得剩下的图无环。请对于所有合法的方案,将方案中翻转方向的边的数量求和。
答案对 \(998244353\) 取模。
source:「CEOI2019」Amusement Park
若翻转 \(S\) 中的边能形成 DAG,那么翻转 \(E/S\) 中的边就会形成反向的 DAG,两种方案加起来翻转 \(m\) 条边。问题转化为本质不同 DAG 计数。
dp 解决这个问题。设 \(f_{s}\) 表示考虑集合 \(s\) 中的点能形成多少种本质不同 DAG。考虑把图按照拓扑序序分层,每次加入一层点。这里需要规定加入的点集是独立集。枚举新加入的层中有哪些点转移。还有一个问题是会算重,手玩一下得到容斥系数是 \((-1)^{|T|-1}\),得到转移:
把后面那一堆记作 \(g_{t}\),规定 \(g_{\empty}=0\),设出集合幂级数,得到:\(F = F\cdot G+1\),即 \(F=\dfrac{1}{1-G}\)。求逆即可。
Exp
集合幂级数 \(\exp\) 的组合意义和 EGF 是类似:把集合划分为若干不交集合的方案数,展开之后很好感性理解。值得注意的是,为了保证收敛性质,在 \(\exp\) 和 \(\ln\) 时保证 \(f_{\empty}=0\)。对于求法,同样我们考虑 exp 的定义:设 \(G=\exp F\),则 \(G^{\prime} = F^{\prime}\exp F = F^{\prime}G\)。考虑其第 \(i-1\) 项系数,则:
边界 \(g_{0} = 1\),据此递推。
例题
给定一个长度为 \(n\) 的非负整数序列 \(A=\{a_1,a_2,\cdots,a_n\}\),对于 \(A\) 的一个子序列 \(B=\{a_{b_1},a_{b_2},\cdots,a_{b_m}\}\)(\(0\le m\le n\),\(1 \le b_1 \lt b_2 \lt \cdots \lt b_m \le n\),下同),称 \(B\) 是 \(A\) 的优秀子序列当且仅当,其任意两个不同元素的按位与结果均为 \(0\),即:\(\forall 1\le i \lt j\le m\),满足:\(a_{b_i}~\mathrm{and}~a_{b_j}=0\),其中 \(\mathrm{and}\) 是按位与运算。
对于子序列 \(B=\{a_{b_1},a_{b_2},\cdots,a_{b_m}\}\),我们定义其价值为 \(\varphi \left(1+\sum\limits_{i=1}^m a_{b_i}\right)\),其中 \(\varphi(x)\) 表示小等于 \(x\) 的正整数中与 \(x\) 互质的数的个数。
现在请你求出 \(A\) 的所有优秀子序列的价值之和,答案对 \(10^9+7\) 取模。
source:「NOI Online 2020 提高组」优秀子序列 (sequence)
优秀子序列
的定义完美契合了子集卷积。把 \(0\) 去掉之后单独处理,记 \(c_i = \sum[a_j=i]\),我们想要的是 \(f_{S}\) 表示子集和为 \(S\) 的方案数,这等价于将 \(S\) 划分成若干集合的方案数,和 \(\exp\) 的意义是如此的一致。因此对 \(C\) 做 \(\exp\) 即可。
Ln
\(\ln\) 依然定义为 \(\exp\) 的逆运算。求法同意根据定义,设 \(G=\ln F+1\),则 \(G^{\prime} = \dfrac{F^{\prime}}{F+1}\)。取 \(i-1\) 项系数,有:
例题
给定无向图,求连通子图个数。
分别设 \(f_{S},g_{S}\) 表示点集 \(S\) 能生成的子图个数和连通子图个数,显然有 \(F = \exp G\),即 \(G = \ln F+1\)。
优化递推
针对一类枚举子集转移的 dp 问题,我们可以通过转成集合幂级数通过预处理或卷积降低复杂度。
例题
小 S 现在拥有 \(n\) 座城市,第 \(i\) 座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连。
现在小 S 要将这 \(n\) 座城市划分成若干个州,每个州由至少一个城市组成,每个城市在恰好一个州内。
假设小 S 将这些城市划分成了 \(k\) 个州,设 \(V_i\) 是第 \(i\) 个州包含的所有城市组成的集合。定义一条道路是一个州的内部道路,当且仅当这条道路的两个端点城市都在这个州内。如果一个州内部存在一条起点终点相同,不经过任何不属于这个州的城市,且经过这个州的所有内部道路都恰好一次的路径(路径长度可以为
\(0\)),则称这个州是不合法的。定义第 \(i\) 个州的满意度为:第 \(i\) 个州的人口在前 \(i\) 个州的人口中所占比例的 \(p\) 次幂,即:
\[\left( \dfrac{\sum_{x \in V_i} w_x}{\sum_{j=1}^i \sum_{x \in V_j}w_x} \right)^p \]定义一个划分的满意度为所有州的满意度的乘积。
求所有合法的划分方案的满意度之和。
答案对 \(998244353\) 取模。
两个划分 \(\{ V_1 \dots V_k \}\) 和 \(\{ C_1 \dots C_s \}\) 是不同的,当且仅当 \(k \neq s\),或存在某个 \(1 \le i \le k\),使得 \(V_i \neq C_i\)。
source:「WC2018」州区划分 (walk)
一个点集合法当且仅当其生成子图中不存在欧拉回路且点集大小大于 \(1\)。设 \(f_{S}\) 表示考虑了点集 \(S\) 中的结点的答案,有转移:
后面的部分可以预处理,记 \(G\) 为后面部分的集合幂级数。由于在这里还有一个系数,我们并不能使用前面提到的求逆技巧。但我们可以使用占位多项式优化转移。首先注意到转移可以按照集合大小进行,因此我们引入占位维,先进行 FWT 或卷积的预处理,然后按照占位维大小(即集合大小)递推。
时间复杂度 \(O(n^22^n)\)。
杂题
刚开始你有一个数字 \(0\),每一秒钟你会随机选择一个 \([0,2^n-1]\) 的数字,与你手上的数字进行或运算。选择数字 \(i\) 的概率是 \(p[i]\)(保证 \(0\leq p[i]\leq 1\),\(\sum p[i]=1\)) 问期望多少秒后,你手上的数字变成 \(2^n-1\)。
source:「HNOI 2015」按位或 (set)
设 \(p\) 的集合幂级数为 \(P\),则根据期望的定义,答案可以写成 \([x^{U}]\sum\limits_{k\ge 0} k(P^k-P^{k-1}) = [x^U]\sum\limits_{k\ge 0}-P^{k}\)。定义乘法为或卷积,FWT 即可得到答案。