【学习笔记】集合幂级数ln,exp
这部分新了解的基础知识还是蛮多的,都简单记录一下防止忘记吧,由于代码都是抄式子,等比较勤快的时候再写
基础知识
\(\Theta(n^2)\) 求 \(n\) 次多项式 \(\ln,\exp\)
\[\begin{aligned}G(x)&=e^{F(x)}\\G'(x)&=F'(x)e^{F(x)}\\ G(x)&=\int F'(x)G(x) \rm{dx} \end{aligned}\]如果已经求解了 \([x^0]G(x)\sim [x^{n-1}]G(x)\) 欲知 \([x^n]G(x)\) 可以比对系数
\[\begin{aligned}G(x)&=\ln \left(F(x)+1\right)\\ G'(x)&=\frac{F'(x)}{F(x)+1}\\ F(x)G(x)+G'(x)&=F'(x)\\ G(x)F(x)&=F'(x)-G'(x) \end{aligned}\]仍然是类似的比对系数,加加减减乘逆元,根据平方求法也不难发现 \(\ln\) 求解时要求 \(f_0=1\)
\(n\) 次多项式 \(k\) 次幂的 \(\Theta(n^2k)\) 求法
\[\begin{aligned}G(x)&=F^k(x)\\G'(x)&=kF'(x)F^{k-1}(x)\\G'(x)&=kF'(x)\frac{F^{k}(x)}{F(x)}\\G'(x)F(x)&=kF'(x)G(x)\end{aligned} \]如果 \(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\) 处的 泰勒展开式:
\[\ln(F(x)+1)=\sum_{i\ge 1}\frac{(-1)^{i+1}F^i(x)}{i} \]\[e^{F(x)}=\sum_{i\ge 0}\frac{F^i(x)}{i!} \]使用组合意义来理解,注意将这里指数运算中乘法定义为子集卷积
将占位集合幂级数先使用 \(\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!}\)
\[\begin{aligned}G(x)&=\sum\limits_{i\ge 1}^k\frac{F^i(x)}{i!}\\ G'(x)&=F'(x)\sum_{i\ge 0}^{k-1}\frac{F^i(x)}{i!}\\ G'(x)&=F'(x)(G(x)-\frac{F^k(x)}{k!}) \end{aligned}\]由于 \(k\) 固定,那么可以得到一个做法是先 \(\ln,\exp\) 得到 \(F^k(x)\) 再比对系数逐项递推