HNOI 2008--明明的烦恼(prufer编号&高精度)

好妙呀。。。

题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=1005

Solution

写题解太。。麻烦了。。。

自行百度prufer吧。。。

一棵树刚好对应一条prufer编码。。。于是只用计算有多少种组合就好了。。。

注意数据很大要用高精度。。。

代码

#include<cstdio>
#include<iostream>
using namespace std;
int c[1005],d[1005],cnt=0,n,sum;
int ch[1005];
int h[100000];
void cheng(int num){
    int tmp=0;
    for(int i=1;i<=h[0];i++){
        h[i]=h[i]*num+tmp;
        tmp=0;
        if(h[i]>9){
            tmp=h[i]/10;
            h[i]%=10;
        }
    }
    while(tmp>0){
        h[0]++;
        h[h[0]]=tmp;
        tmp=0;
        if(h[h[0]]>9){
            tmp=h[h[0]]/10;
            h[h[0]]%=10;
        }
    }
}
int main(){
    int m=0,temp;
    scanf("%d",&n);
    if(n==1){
        scanf("%d",&c[1]);
        if (c[1]==0||c[1]==-1) printf("1\n");
        else printf("0\n");
        return 0;
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    for(int i=1;i<=n;i++){
        if(c[i]==0){printf("0\n");return 0;}
        if(c[i]!=-1){
            d[++cnt]=c[i]-1;
            sum+=d[cnt];
        }
        else m++;
    }
    if(n-2<sum){printf("0\n");return 0;}
    for(int i=1;i<=cnt;i++)
        for(int j=2;j<=d[i];j++){
            temp=j;
            for(int k=2;k<=j&&temp!=1;k++)
                while(temp%k==0){
                    ch[k]--;
                    temp/=k;
                }
        }
    for(int i=n-2-sum+1;i<=n-2;++i){
        temp=i;
        for(int k=2;k<=i&&temp!=1;k++)
            while(temp%k==0){
                ch[k]++;
                temp/=k;
            }
    }
    h[0]=1;h[1]=1;
    for(int i=1;i<=n;i++)
        while(ch[i]>0){
            ch[i]--;
            cheng(i);
        }
    for(int i=1;i<=n-2-sum;i++)
        cheng(m);
    for(int i=h[0];i>=1;i--)
        printf("%d",h[i]);
    printf("\n");
    return 0;
}

  

  

This passage is made by Yukino.

时间: 2024-10-09 21:29:36

HNOI 2008--明明的烦恼(prufer编号&高精度)的相关文章

bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&amp;&amp;生成树计数

1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Status] Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度

【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度

题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1 输出 一个整数,表示不同的满足要求的树的个数,无解输出0 样例输入 3 1 -1 -1 样例输出 2 题解 Prufer序列+高精度 Prufer序列:由一棵 $n$ 个点的树唯一产生的一个 $n-2$ 个数的序列. 生成方法:找到这棵树编号最小的叶子节点,将其

BZOJ 1005 明明的烦恼(prufer序列+高精度)

有一种东西叫树的prufer序列,一个树的与一个prufer序列是一一对应的关系. 设有m个度数确定的点,这些点的度为dee[i],那么每个点在prufer序列中出现了dee[i]-1次. 由排列组合可以推出公式.需要用高精度. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 1100 using namespace std; typede

[BZOJ1005](HNOI 2008)明明的烦恼

Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1 Output 一个整数,表示不同的满足要求的树的个数,无解输出0 Sample Input 3 1 -1 -1 Sample Output 2 HINT 两棵树分别为1-2-3;1-3

BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度

题目大意:给定一棵n个节点的树的节点的度数,其中一些度数无限制,求可以生成多少种树 Prufer序列 把一棵树进行以下操作: 1.找到编号最小的叶节点,删除这个节点,然后与这个叶节点相连的点计入序列 2.反复进行1,直到这棵树只剩下两个节点时,退出 比如说这个图(来自度受百科) 最小叶节点为2,删除2,将3计入序列 最小叶节点为4,删除4,将5计入序列 最小叶节点为5,删除5,将1计入序列 最小叶节点为1,删除1,将3计入序列 图中只剩下两个节点,退出 于是得到这棵树的Prufer序列为{3,5

【组合数学】【高精度】【prufer数列】【HNOI 2008】【bzoj 1005】明明的烦恼

1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3217 Solved: 1290 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣-- 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1 Output 一个

【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度

[BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1 Output 一个整数,表示不同的满足要求的树的个数,无解输出0 Sample Input 3 1 -1 -1 Sample Outp

BZOJ_1005_ [HNOI2008]_明明的烦恼_(组合数学+purfer_sequence+高精度+分解因数)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1005 一棵树有n个点,给出没给节点的度,如果没有限制则为-1,求共有多少种可能的树. 分析 蒟蒻我肯定是不会做的,所以先来抄一段题解... 这题需要了解一种数列: Purfer Sequence 我们知道,一棵树可以用括号序列来表示,但是,一棵顶点标号(1~n)的树,还可以用一个叫做 Purfer Sequence 的数列表示 一个含有 n 个节点的 Purfer Sequence 有 n-

BZOJ 1005 明明的烦恼(Prufer数列)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1005 题意:给出一棵树的某些节点的度数d,有些未给.问满足这个条件的树有多少种? 思路:(1)Prufer 数列是无根树的一种数列.由一棵树可以构造出一个Prufer数列,Prufer数列可转化为原来的树.由树生成Prufer的一种简单方法是每次找出标 号最小的叶子节点将其父节点添加到Prufer数列并将该叶子节点删除.直到最后只剩下两个节点时结束.比如下面的这个树按照我们刚才的方法生