【学习笔记】集合幂级数ln,exp

这部分新了解的基础知识还是蛮多的,都简单记录一下防止忘记吧,由于代码都是抄式子,等比较勤快的时候再写

基础知识

Θ(n2)n 次多项式 ln,exp

G(x)=eF(x)G(x)=F(x)eF(x)G(x)=F(x)G(x)dx

如果已经求解了 [x0]G(x)[xn1]G(x) 欲知 [xn]G(x) 可以比对系数

G(x)=ln(F(x)+1)G(x)=F(x)F(x)+1F(x)G(x)+G(x)=F(x)G(x)F(x)=F(x)G(x)

仍然是类似的比对系数,加加减减乘逆元,根据平方求法也不难发现 ln 求解时要求 f0=1

n 次多项式 k 次幂的 Θ(n2k) 求法

G(x)=Fk(x)G(x)=kF(x)Fk1(x)G(x)=kF(x)Fk(x)F(x)G(x)F(x)=kF(x)G(x)

如果 G(x) 的前 n 项已知之后想知道 n+1 项,比较系数就可以发现两边同时取 [xn+1] 就可以得到了

这个做法在 nlognk 的时候有奇效

集合幂级数 ln,exp

写出来关于集合幂级数 F(x)ln(F(x)+1),eF(x)x0=0 处的 泰勒展开式:

ln(F(x)+1)=i1(1)i+1Fi(x)i

eF(x)=i0Fi(x)i!

使用组合意义来理解,注意将这里指数运算中乘法定义为子集卷积

将占位集合幂级数先使用 FMT 求出来点值,对于 SU 的每个 S 观察,此时 F^S 是一个形式幂级数,求出其 ln/exp 时候再做逆变换即可

有了这个就可以轻松解决 联通生成子图计数 问题

LOJ6729 点双联通生成子图计数

设点的标号是 [0,n)

指导性的思路就是求所有割点标号都 i 的集合幂级数,一开始得到联通的生成子图数量 F0,最后的答案就是 Fn

尝试 FiFi+1,要更改的部分就是 i 做为割点的部分

对于 iS 的每个集合 S,先保留 F{S}F{S}/i 表示根据定义中删掉 i 剩下的部分割点 i 的方案数(也就是说这里保证了直接联通)

对于那些不一定能满足联通的部分,再将 FS 减掉 F{S}/i 之后做形式幂级数的 ln 即可

最后再做逆变换,全集对应的占位幂级数就是答案

LOJ6730 边双联通生成子图计数

边双连通生成子图可以理解为不存在大小为 2 的点双连通分量的连通生成子图

那么算出点双连通生成子图的集合幂级数后去掉 2 次项,然后倒着做一遍上面枚举每个点容斥的过程即可

这里需要把取 ln 变为做 exp,因为要做的工作是把已经满足点双联通且大小大于 2 的集合拼起来

可能理解得并不深刻,后续存在补坑可能

LOJ154 kexp 问题

如果给定 ki0kFi(x)i! 这个也是非常类似的,仍然求出来占位幂级数的 FMT 点值

对于每个位置上的形式幂级数,我们想要求 G(x)=i0kFi(x)i!

G(x)=i1kFi(x)i!G(x)=F(x)i0k1Fi(x)i!G(x)=F(x)(G(x)Fk(x)k!)

由于 k 固定,那么可以得到一个做法是先 ln,exp 得到 Fk(x) 再比对系数逐项递推

posted @   没学完四大礼包不改名  阅读(832)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示