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