CF1528E
\[\large{ f_h = f_{h-1} \times ( 1 + \sum_{t=0}^{h-2} f_t ) + \dfrac{f_{h-1}(f_{h-1}+1)}{2} }
\]
\(f_h\) 表示的是每个点度数 \(\le 3\)(根节点 \(\le 2\)),高为 \(h\) 的树个数,前缀和优化即可做到 \(O(n)\)。
最终的形态是一棵内向树的根通过一条外向直链拼上一棵外向树的根。其中任意一边都可能不存在,这部分答案是 \(2F_n\),\(F_i\) 表示根节点度数 \(\le 3\) 的方案数,这个可以通过 \(f_i\) 来求,相当于在 \(f_i\) 基础上再转移一次;两部分都存在时,考虑枚举这条直链的长度 \(len\),且钦定两边的根 \(\rm deg = 2\)(\(\rm deg = 1\) 的情况相当于 \(len\) 更长的情况,会在之后被枚举;\(\rm deg = 0\) 说明这边不存在,是第一种情况),这个方案数就是 \(f_h-f_{h-1}\)(去掉只有一个儿子的情况),然后再枚举内向树的树高 \(h\),可以得到答案
\[\large{ \sum_{len=1}^{n} \sum_{h=1}^{n-len-1}d_h \times d_{n-len-h} }
\]
这里 \(d\) 是 \(f\) 的差分数组。
\[\large{ \sum_{len=1}^{n} \sum_{h=1}^{n-len-1}d_h \times d_{n-len-h}
= \sum_{h=1}^{n-2} d_h \sum_{len=1}^{n-h-1} d_{n-len-h}
= \sum_{h=1}^{n-2} d_h \sum _{i=1}^{n-h-1} d_i }
\]
右边那个求和就是 \(f_{n-h-1} - 1\),于是可以 \(O(n)\) 了。
诶 \(F_n\) 好像不是那么好求(
\[\large{ F_n = f_{n-1} \times [\dbinom{S}{2} + 2\dbinom{S}{1} + 1] + [\dbinom{f_{n-1}}{2}+\dbinom{f_{n-1}}{1}] \times [\dbinom{S}{1}+1] + [\dbinom{f_{n-1}}{3} + 2\dbinom{f_{n-1}}{2}+\dbinom{f_{n-1}}{1}] }
\]
然后没了捏。
注意上面最后面那个系数 \(2\) 表示选出这两棵子树后还需要确定它们哪个用两次。

浙公网安备 33010602011771号