做模拟赛的时候碰到了,感觉稍微有点意思,写来自己看。
【无标号有根树】
设fn表示树的大小为n的方案数,其生成函数
考虑生成函数的组合意义,fn+1可以由若干个无序的不同大小的“若干个无序的相同大小的本质不同的子树”拼成,对于大小为k的树,作为多棵子树时他可以贡献的不同树形态的生成函数是
考虑对F(z)两边取对数并求导,有
F′(z)F(z)=1z+∑n>0fnnzn−11−zn
乘一乘得
zF′(z)=F(z)+(∑n>0fnnzn1−zn)F(z)
对应系数有
nfn=fn+∑j>0fj[zn−j]∑k(kfkzk1−zk)
考虑[zn]zk1−zk的取值,注意到后面的函数是∑∞j=k[k∣j]zj,所以[zn]zk1−zk=[k∣n],所以
(n−1)fn=∑j=1n−1fj∑k∣n−jkfk
后面可以每次更新的时候存下来,所以直接递推复杂度是O(n2)的。
分治fft之后可以做到O(nlog2n)。
【无标号无根树】
设hn表示无根树的方案,fn同上。考虑怎么唯一表示一棵树,我们可以用重心。那么我们可以在所有有根树里去掉根不是重心的情况,即hn=fn−∑⌊n/2⌋k=1fkfn−k,当n为偶数时可能会有两个重心,所以加回
求出f之后算单个