洛谷P2624 [HNOI2008]明明的烦恼(prufer序列 树计数)

题目

给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树

输入:第一行为N(0<N<=1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

输出:一个整数,表示不同的满足要求的树的个数,无解输出0

思路来源

https://m-sea-blog.com/archives/1661/

题解

prufer序列,常用来解决,和度数有关的树计数问题

大数,懒得粘板子,py一发入魂,这个列表用得妙啊

太久不用py了,除法要用整除的//,否则会被理解成double从而在洛谷里RE

代码

n = int(input())
fac = [1]
ans = 1
for i in range(1, n - 1):
    fac = fac + [fac[i - 1] * i]
ans = fac[n - 2]
cnt = 0
sum = n - 2
for i in range(n):
    d = int(input())
    if d != -1:
        ans = ans // fac[d - 1]
        sum -= d-1
    else:
        cnt += 1
ans = ans // fac[sum]
for i in range(sum):
    ans = ans * cnt
print(ans)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值