题目大意
给定一张$n(3\le n \le 10^5)$个节点的树($n$为奇数),将这$n-1$条边两两分组,
要求:分到同一组的边有相同的顶点。
求一共有多少种方法。结果对$998244353$取模
思路
假设第一个节点是父节点。
可以发现以下规律:
- 对于一个节点$u$的子节点$v$,如果$v$的“可供使用”的边数(除去与$u$相连的)为偶数,那么与$u$相连的这条边对于$u$来说,就是“可供使用”的了。(“可供使用”的意思就是可以与这个节点上的其它节点结合)。
- 对于一个节点$u$的子节点$v$,如果$v$的“可供使用”的边数(除去与$u$相连的)为奇数,那么与$u$相连的这条边就要用来与$v$相连的边组合,否则就无法成功分配。
那么对于每个节点可供使用的边,如果是偶数,那我们就两两分组,如果是奇数,那么我们留下与父节点相连的边,剩下的两两分组。
那么$n$($n$为偶数)个数两两分组的计算方式:
$$\frac{C_n^2 + C_{n-2}^2 + …C_2^2}{A_{n/2}^{n/2}}$$
经过一番高强度化简之后得:
$$(n-1) * (n - 3) * … 3 * 1$$
那么剩下就是解决可供使用的边的问题了,该如何计算呢?
这个“可供使用”的边是一个“递归”定义的,我们只看一个点和它的边,是没有办法看出来它那些边是可以使用的,必须看它的子节点的可以使用的边,而它的子节点又和子节点的子节点有关系…
所以我们就用类似树形DP的方法,从根节点开始dfs:
那么边界条件:叶子节点没有可供使用的边,所以也算偶数,那么它和父节点相连的这条边,就可以被父亲节点使用。
那么剩下的就一直按照最开始分析的计算即可。
代码
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2021/12/02/Edge-groups/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!