zoukankan      html  css  js  c++  java
  • 【洛谷2290】[HNOI2004] 树的计数(Python+利用prufer序列结论求解)

    点此看题面

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

    (prufer)序列

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

    考虑到由(prufer)序列得到的结论:对于给定度数为(d_{1sim 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);#否则无解
    
  • 相关阅读:
    LoadRunner脚本关联动态数据的最简单方法
    LoadRunner 检查点函数总结
    算法(一)时间复杂度
    JAVA虚拟机总结
    java8中Lambda表达式和Stream API
    算法总结
    listview 异步加载图片并防止错位
    Java设计模式菜鸟系列(一)策略模式建模与实现
    Python基础--webbrowser
    Shiro学习(22)集成验证码
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu2290.html
Copyright © 2011-2022 走看看