这部分新了解的基础知识还是蛮多的,都简单记录一下防止忘记吧,由于代码都是抄式子,等比较勤快的时候再写
基础知识
Θ(n2) 求 n 次多项式 ln,exp
G(x)=eF(x)G′(x)=F′(x)eF(x)G(x)=∫F′(x)G(x)dx
如果已经求解了 [x0]G(x)∼[xn−1]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)Fk−1(x)G′(x)=kF′(x)Fk(x)F(x)G′(x)F(x)=kF′(x)G(x)
如果 G(x) 的前 n 项已知之后想知道 n+1 项,比较系数就可以发现两边同时取 [xn+1] 就可以得到了
这个做法在 n≤lognk 的时候有奇效
集合幂级数 ln,exp
写出来关于集合幂级数 F(x) 的 ln(F(x)+1),eF(x) 在 x0=0 处的 泰勒展开式:
ln(F(x)+1)=∑i≥1(−1)i+1Fi(x)i
eF(x)=∑i≥0Fi(x)i!
使用组合意义来理解,注意将这里指数运算中乘法定义为子集卷积
将占位集合幂级数先使用 FMT 求出来点值,对于 S∈U 的每个 S 观察,此时 ˆFS 是一个形式幂级数,求出其 ln/exp 时候再做逆变换即可
有了这个就可以轻松解决 联通生成子图计数 问题
LOJ6729 点双联通生成子图计数
设点的标号是 [0,n)
指导性的思路就是求所有割点标号都 ≥i 的集合幂级数,一开始得到联通的生成子图数量 F0,最后的答案就是 Fn
尝试 Fi→Fi+1,要更改的部分就是 i 做为割点的部分
对于 i∈S 的每个集合 S,先保留 F{S}→F{S}/i 表示根据定义中删掉 i 剩下的部分割点 ≥i 的方案数(也就是说这里保证了直接联通)
对于那些不一定能满足联通的部分,再将 FS 减掉 F{S}/i 之后做形式幂级数的 ln 即可
最后再做逆变换,全集对应的占位幂级数就是答案
LOJ6730 边双联通生成子图计数
边双连通生成子图可以理解为不存在大小为 2 的点双连通分量的连通生成子图
那么算出点双连通生成子图的集合幂级数后去掉 2 次项,然后倒着做一遍上面枚举每个点容斥的过程即可
这里需要把取 ln 变为做 exp,因为要做的工作是把已经满足点双联通且大小大于 2 的集合拼起来
可能理解得并不深刻,后续存在补坑可能
LOJ154 k−exp 问题
如果给定 k 求 k∑i≥0Fi(x)i! 这个也是非常类似的,仍然求出来占位幂级数的 FMT 点值
对于每个位置上的形式幂级数,我们想要求 G(x)=k∑i≥0Fi(x)i!
G(x)=k∑i≥1Fi(x)i!G′(x)=F′(x)k−1∑i≥0Fi(x)i!G′(x)=F′(x)(G(x)−Fk(x)k!)
由于 k 固定,那么可以得到一个做法是先 ln,exp 得到 Fk(x) 再比对系数逐项递推
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律