0%

题解-直径和

A shoulder for the past

直径和

nn 个点的有标号无根树的直径之和

Solution:

基础思想是找到直径中点拼起来

假设我们能 dp 出来深度为 jj 大小为 ii 的树和森林的个数

对于奇数的只需要取中间的边就能把树分成两个部分,枚举两个部分的大小即可

偶数需要容斥,取直径的中点,他至少要有两个子树深度为 d21\dfrac{d}{2}-1 先算存在的,然后枚举大小减去有一个不合法的

具体而言 设 fi,jf_{i,j} 表示 ii 个点 深度至多为 jj 的树个数 ,gi.jg_{i.j} 表示 ii 个点,深度至多为 jj 的森林个数

hi,jh_{i,j} 表示 ii 个点 深度为 jj 的树个数

转移有 fi,jgi,j1×if_{i,j} \gets g_{i,j-1} \times i 选定根

gi,j=(i1k1)fk,jgik,jg_{i,j} = \sum \binom{i-1}{k-1} f_{k,j}g_{i-k,j} 加上一个新树(注意标号)

奇数直径为 (n1i1)hi,d×hni,d\sum \binom{n-1}{i-1}h_{i,d}\times h_{n-i,d} ,偶数为 hn,d(ni)hi,d1×fni,d1h_{n,d}-\sum \binom{n}{i}h_{i,d-1}\times f_{n-i,d-1}