https://jzoj.net/senior/#main/show/3194
Problem
- 求个点的每个点度数不超过的无标号无根树个数.
Data constraint
Solution
-
尝试着把问题一般化。我们来考虑一个这样的问题:求个节点,每个节点度数不超过的无根树个数。
-
为了解决这个问题,我们不妨先来解决有根树的情况。注意这里的树都是无标号的。所以每一种合法树的根的子树的都可以看做是单调的。然而无根树的计数实在很麻烦。例如在无根树中以下两种情况视作同一种:
-
而在有根树情况下,这两种方案显然是不一样的。
-
但注意,对于有根树这两种情况也是一样的:
-
所以转化成有根树,我们可以更方便的进行DP。并且通过上面这两幅图我们发现唯一需要注意的是子树的关系。
-
不妨令表示当前根节点度为,总共有个节点时的方案数。此外,我们理应记录一下当前子树的最大,然后每次枚举个更大的去尝试着转移。但实质上我们可以不用记录,我们直接从小到大枚举这个,然后尝试转移.
-
枚举当前最大子树的个数,令,我们不难写出这样一个式子:
-
其中表示的是在个盒子中放个球,盒子不同,球相同,可以重复放的方案。这正好符合我们的要求。不难发现,我们这样枚举的一定可以保证子树是单调的,那么避免了算重。
-
解决了有根树,我们现在来考虑无根树的问题。事实上,有一个极其巧妙且重要的性质:两颗无根树同构,则以它们重心为根的有根树同构
-
那么我们就只需保证即可。唯一需要注意的是,当一棵树有两个重心的时候,我们的都是小于的,所以我们要特殊处理一下两个的拼接,这也同样是一个组合数。