目录
显示
题目链接
https://www.luogu.org/problem/P2290
题解
在解决本题之前,我们需要认识一下 prufer 序列。
prufer 序列可以将一个含有 \(n\) 个节点的无根树转化为一个长度为 \(n-2\) 的序列。
构建 prufer 序列的过程很简单:我们每次选出所有度为 \(1\) 的节点中编号最小的点,将它删除,并将其父亲节点加入 prufer 序列,重复上面的操作直到树中只剩下两个节点为止。
我们可以发现,无根树和 prufer 序列是一一对应的。
同时我们还会发现一个显然的结论,无根树中度数为 \(d\) 的点会在 prufer 序列中出现 \(d-1\) 次(度数为 \(1\) 的节点会被直接删除,否则会先删除与其相邻的 \(d-1\) 个点,即将该点加入 prufer 序列 \(d-1\) 次)。
有了上面这个结论,就可以来解决本题了。
求无根树的数量,等价于求满足条件的 prufer 序列的数量。容易发现我们事实上是在求一个可重集的排列数目,将上面的结论带入可重集排列公式,就可以得到答案了。
$$\frac{(n-2)!}{\prod_{i=1}^n d_i-1}$$
虽然答案保证在 long long 范围内,但要注意中间结果溢出的问题。
(python 大法好啊)
n=int(input())
s=input().split()
if n==1 :
if int(s[0])==0 :
print(1)
else :
print(0)
else :
f=[1]
for i in range(1,n+1):
f.append(f[i-1]*i)
ans=f[n-2]
cnt=0
for i in range(n):
cnt=cnt+int(s[i])
ans=ans//f[int(s[i])-1]
if cnt!=2*n-2 :
print(0)
else :
print(ans)