【洛谷2290】[HNOI2004] 树的计数(Python+利用prufer序列结论求解)

点此看题面

大致题意: 给定每个点的度数,让你求有多少种符合条件的无根树。

\(prufer\)序列

这显然是一道利用\(prufer\)序列求解的裸题。

考虑到由\(prufer\)序列得到的结论:对于给定度数为\(d_{1\sim n}\)的一棵无根树共有\(\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!}\)种情况

套公式即可。

高精/质因数分解/\(Python\)

等等,答案小于\(10^{17}\)

这看似在\(long\ long\)范围内,但是我们前面有除法啊!运算过程中肯定会爆\(long\ long\)

然后就有\(3\)种做法:

  • 高精。
  • 质因数分解。即把每个质因数出现的次数记下来,然后除法就变成了减法。最后相乘即可。
  • \(Python\)自带高精,写这种题目的必备利器。

我自然是选择了\(Python\)

顺带通过猜想+尝试学会了\(Python\)压行\(233333\)

最后提醒一句,需要判无解

代码

n=(int)(input())#读入n
if n==1:#特判n=1的情况
    x=(int)(input());#读入唯一的节点度数
    if x==0:print(1);#如果这个节点度数为0,说明只有一种解法
    else:print(0);#否则,无解
    exit();#退出程序
f=[0 for i in range(n+5)];f[0]=1;#建立阶乘数组
for i in range(1,n+1):f[i]=f[i-1]*i;#预处理阶乘
ans=f[n-2];tot=0;s=input().split();#初始化ans为(n-2)!,用tot统计度数和来判断是否无解
for i in range(n):
    x=(int)(s[i]);
    if x==0:print(0);exit();#如果存在某个点度数为0,说明图不连通,输出0
    tot+=x-1;ans//=f[x-1];#统计度数和,更新答案
if(tot==n-2):print(ans);#如果度数和为n-2,输出ans
else:print(0);#否则无解

转载于:https://www.cnblogs.com/chenxiaoran666/p/Luogu2290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值