题意
一棵树,给定每个点的度数,\(-1\)为无限制,求满足该度数的树的个数。
题解
prufer序列的裸题。
关于prufer序列,网上有更加详细的介绍,这里就不展开说明了,只介绍跟该题相关的性质。
所有无根树可以跟prufer序列形成双射。
一棵无根树,每个点在prufer序列出现的次数为它的度数减一。
这道题显然只要确定有度数限制的那些点,剩下的点任取即可。
记每个点的度数限制为\(d[i]\),\(cnt\)为没有度数限制的点的个数
\[ans = \frac{A(n - 2, \sum (d[i] - 1))}{\Pi A(d[i] - 1)} \times cnt ^ {n - 2 - \sum (d[i] - 1)}
\]
这道题需要高精度,但是普通的高精度仍然不够,因为组合数增长是\(n!\)级别的。
但是显然答案的长度不会很长。
于是可以记录指数来先进行乘除运算,最后再统一计算答案。
质因数分解每个要乘的数即可。
注意判断无解的情况,即度数减一之和大于序列长度 或者 有点的度数为0但是n不为1。
(BZOJ的题真的是每道题都有收获)
#include
#include
#include
#include
#include
#include