P2290题解

Prufer 序列裸题。

简单的介绍一下这个神奇的数列:

  • 定义:一颗无根树,每次将度数为1的节点的父亲加入序列,并将其删除,最终得到一个长度为 \(n-2\) 的序列。

  • 将 Prufer 序列转化为无根树:每次取出序列中最前面的数,将一个在点集中且最小的数与其连边,最后将序列最靠前的数和刚刚在点集中取出的数在分别在序列和点集中删去。最后将剩下的两个未连边的点连边即可。

  • Prufer 序列性质:

  • 度数为 \(d_i\) 的节点只会在序列中出现 \(d_i-1\) 次。

  • 生成 \(n\) 节点的完全图(树)有 \(n^{n-2}\) 种(Cayley 定理)。

  • 生成每一种树的方式有 \((n-1)!\) 种(Cayley 定理)。

  • 对于给定度数 \(d_{ 1-n}\)\(n\) 个节点,共有 $\frac{(n-2)!}{\prod_{i=1}^{n} (d_i-1)!} $ 种形成树的方式。

其中第二条和第三条由第一条推导而出,第四条由第二和第三条推导而出。

辅助做题结论:对于 \(n\) 个结点形成的树,$ {\textstyle \sum_{i=1}^{n}(d_i-1)}=n-2 $。


接下来看本题,本题即为需要利用上面写到的第四条性质,即为答案: $\frac{(n-2)!}{\prod_{i=1}^{n} (d_i-1)!} $ 。

而最后你会发现 \((n-2)!\) 超出 \(10^{18}\) 范围了,所以要边乘边除,并且注意特判:若根度数为 \(0\) 输出 \(0\)

posted @ 2023-06-06 18:17  Pwtking  阅读(28)  评论(0)    收藏  举报