无标号生成树计数

本文探讨了无标号有根树和无标号无根树的生成函数及其计数方法。通过分析生成函数的组合意义,得出F(z)的表达式,并通过取对数和求导进行进一步的数学推导。同时,提出了利用重心表示无根树的思路,给出了计算无根树方案数的公式,指出在特定情况下需要额外考虑。算法复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做模拟赛的时候碰到了,感觉稍微有点意思,写来自己看。

【无标号有根树】
fn表示树的大小为n的方案数,其生成函数F(z)=n>0fnzn
考虑生成函数的组合意义,fn+1可以由若干个无序的不同大小的“若干个无序的相同大小的本质不同的子树”拼成,对于大小为k的树,作为多棵子树时他可以贡献的不同树形态的生成函数是(jzjk)fk=(1zk)fk,再将所有不同大小的子树拼起来,得n>0(1zn)fn,所以F(z)=zn>011znfn。当然我们可以用同样的思路得到生成函数的另一个形式是zn>0expF(zn),但是我并不能从这个形式往后推出什么。。。
考虑对F(z)两边取对数并求导,有

F(z)F(z)=1z+n>0fnnzn11zn

乘一乘得
zF(z)=F(z)+(n>0fnnzn1zn)F(z)

对应系数有
nfn=fn+j>0fj[znj]k(kfkzk1zk)

考虑[zn]zk1zk的取值,注意到后面的函数是j=k[kj]zj,所以[zn]zk1zk=[kn],所以
(n1)fn=j=1n1fjknjkfk

后面可以每次更新的时候存下来,所以直接递推复杂度是O(n2)的。
分治fft之后可以做到O(nlog2n)

【无标号无根树】
hn表示无根树的方案,fn同上。考虑怎么唯一表示一棵树,我们可以用重心。那么我们可以在所有有根树里去掉根不是重心的情况,即hn=fnn/2k=1fkfnk,当n为偶数时可能会有两个重心,所以加回f2n/2(fn/22)=(fn/2+12)
求出f之后算单个hO(n)的。也可以卷积然后减一减。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值