P2624 [HNOI2008]明明的烦恼
传送门
题目描述
自从明明学了树的结构,就对奇怪的树产生了兴趣…… 给出标号为$1$到$N$的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树?
输入输出格式
输入格式:
第一行为$N (0 < N \le 1000)$,接下来$N$行,第$i+1$行给出第i个节点的度数$D_i$,如果对度数不要求,则输入$-1$
输出格式:
一个整数,表示不同的满足要求的树的个数,无解输出$0$
输入输出样例
输入样例#1:
3
1
-1
-1
输出样例#1:
2
说明
两棵树分别为1-2-3 ; 1-3-2
分析
前置知识:$Prufer$数列。
众所周知,对于给定度数的无根树,共有$\cfrac{ (n-2)! }{ \prod_{i=1}^n (d_i-1)! }$情况。使用$Prufer$数列可以很方便的证明。
但本题不是这么简单。
首先考虑已知的条件,我们记$sum$为已知条件的和,$cnt$为已知条件个数。
很显然,只考虑已知度数的点组成的无根树的情况,共有$\cfrac{ sum! }{ \prod_{i=1}^{cnt} (d_i-1)!}$种情况,直接套开头的式子。
再考虑在总点数组成的$Prufer$数列中,由我们的已知点组成的$Prufer$子序列有多少种情况,显然,组合知识告诉我们,有$\dbinom{n-2}{sum}$种情况。
在考虑剩下的位置,所以要乘上$(n-cnt)^{n-2-sum}$。
化简一波:
发现一个很尴尬的问题,我们…似乎需要…高精度!!!
高精乘还好说,高精除就比较尴尬了。弃疗
其实还有一个办法,质因数分解。
对于$n!$,如果$p$是一个质数,那么它的次数为
所以高精除就搞定了。
至于高精乘,打板子。
参考资料
$Prufer$数列
自为风月马前卒的 prufer序列笔记
xun的 prufer数列
本题题解
本校巨佬autoint的题解
TheLostWeak的题解
JMJST的题解
怡红公子的题解
代码
1 |
|