【学习笔记】集合幂级数ln,exp
这部分新了解的基础知识还是蛮多的,都简单记录一下防止忘记吧,由于代码都是抄式子,等比较勤快的时候再写
基础知识
\(\Theta(n^2)\) 求 \(n\) 次多项式 \(\ln,\exp\)
如果已经求解了 \([x^0]G(x)\sim [x^{n-1}]G(x)\) 欲知 \([x^n]G(x)\) 可以比对系数
仍然是类似的比对系数,加加减减乘逆元,根据平方求法也不难发现 \(\ln\) 求解时要求 \(f_0=1\)
\(n\) 次多项式 \(k\) 次幂的 \(\Theta(n^2k)\) 求法
如果 \(G(x)\) 的前 \(n\) 项已知之后想知道 \(n+1\) 项,比较系数就可以发现两边同时取 \([x^{n+1}]\) 就可以得到了
这个做法在 \(n\le \log nk\) 的时候有奇效
集合幂级数 \(\ln,\exp\)
写出来关于集合幂级数 \(F(x)\) 的 \(\ln(F(x)+1),e^{F(x)}\) 在 \(x_0=0\) 处的 泰勒展开式:
使用组合意义来理解,注意将这里指数运算中乘法定义为子集卷积
将占位集合幂级数先使用 \(\rm FMT\) 求出来点值,对于 \(S\in U\) 的每个 \(S\) 观察,此时 \(\widehat{F}_S\) 是一个形式幂级数,求出其 \(\ln/\exp\) 时候再做逆变换即可
有了这个就可以轻松解决 联通生成子图计数 问题
LOJ6729 点双联通生成子图计数
设点的标号是 \([0,n)\)
指导性的思路就是求所有割点标号都 \(\ge i\) 的集合幂级数,一开始得到联通的生成子图数量 \(F_0\),最后的答案就是 \(F_n\)
尝试 \(F_i\to F_{i+1}\),要更改的部分就是 \(i\) 做为割点的部分
对于 \(i\in S\) 的每个集合 \(S\),先保留 \(F_{\{S\}}\rightarrow F_{\{S\}/i}\) 表示根据定义中删掉 \(i\) 剩下的部分割点 \(\ge i\) 的方案数(也就是说这里保证了直接联通)
对于那些不一定能满足联通的部分,再将 \(F_{S}\) 减掉 \(F_{\{S\}/i}\) 之后做形式幂级数的 \(\ln\) 即可
最后再做逆变换,全集对应的占位幂级数就是答案
LOJ6730 边双联通生成子图计数
边双连通生成子图可以理解为不存在大小为 \(2\) 的点双连通分量的连通生成子图
那么算出点双连通生成子图的集合幂级数后去掉 \(2\) 次项,然后倒着做一遍上面枚举每个点容斥的过程即可
这里需要把取 \(\ln\) 变为做 \(\exp\),因为要做的工作是把已经满足点双联通且大小大于 \(2\) 的集合拼起来
可能理解得并不深刻,后续存在补坑可能
LOJ154 \(k-\exp\) 问题
如果给定 \(k\) 求 \(\sum\limits_{i\ge 0}^k\frac{F^i(x)}{i!}\) 这个也是非常类似的,仍然求出来占位幂级数的 \(\rm FMT\) 点值
对于每个位置上的形式幂级数,我们想要求 \(G(x)=\sum\limits_{i\ge 0}^k\frac{F^i(x)}{i!}\)
由于 \(k\) 固定,那么可以得到一个做法是先 \(\ln,\exp\) 得到 \(F^k(x)\) 再比对系数逐项递推