BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数

1005: [HNOI2008]明明的烦恼

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

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

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

题意

题解

实际上就是让你求,有多少种Purfer序列

理解Purfer序列之后,这就是排列组合题了

这篇博文写的非常精彩:http://www.cnblogs.com/zhj5chengfeng/archive/2013/08/23/3278557.html

代码:

import java.util.*;
import java.math.*;

public class Main {
    static int n, d[]=new int[10002];
    static BigInteger p[]=new BigInteger[1002];
    static BigInteger ans;

    static public void main(String args[]) {
        Scanner IN=new Scanner(System.in);
        n=IN.nextInt();
        int sum=0, flag=0, cnt=0;
        for(int i=0; i<n; i++) {
            d[i]=IN.nextInt();
            if(d[i]==0 || d[i]>n-1) flag=1;
            if(d[i]==-1) continue;
            sum+=d[i]-1;
            cnt++;
        }
        IN.close();
        if(n==1) {
            if(d[0]==0 || d[0]==-1) System.out.println(1);
            else System.out.println(0);
            return;
        }
        if(n==2) {
            if((d[0]==-1 || d[0]==1) && (d[1]==-1 || d[1]==-1)) System.out.println(1);
            else System.out.println(0);
            return;
        }
        if(flag==1) System.out.println(0);
        p[0]=BigInteger.ONE;
        for(int i=1; i<=n; i++) p[i]=p[i-1].multiply(BigInteger.valueOf(i));
        ans=p[n-2].divide(p[n-2-sum]);
        for(int i=0; i<n; i++) {
            if(d[i]==-1) continue;
            ans=ans.divide(p[d[i]-1]);
        }
        for(int i=0; i<n-2-sum; i++) ans=ans.multiply(BigInteger.valueOf(n-cnt));
        System.out.println(ans);
    }
}
时间: 2024-08-09 23:51:49

BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数的相关文章

BZOJ 1005: [HNOI2008]明明的烦恼 Purfer数列

Purfer数列: http://www.cnblogs.com/zhj5chengfeng/p/3278557.html 题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N(0<N<=1000),接下来 N 行,第 i+1 行给出第 i 个节点的度数 Di,如果对度数不要求,则输入 -1 Output 一个整数,表示不同的满足要求的树的个数,无解

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,如果对度

bzoj 1005: [HNOI2008]明明的烦恼(组合数学 purfer sequence)

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

bzoj 1005: [HNOI2008]明明的烦恼

1 #include<cstdio> 2 #include<iostream> 3 #define M 10005 4 int a[M],n,d[M],f[M],b[M],tot,m; 5 void jia(int a1) 6 { 7 for(int i=1;i<=d[0];i++) 8 for(;a1%d[i]==0;) 9 { 10 b[i]++; 11 a1/=d[i]; 12 } 13 return; 14 } 15 void jian(int a1) 16 { 17

【组合数学】【高精度】【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 一个

【BZOJ】1005: [HNOI2008]明明的烦恼(prufer编码+特殊的技巧)

http://www.lydsy.com/JudgeOnline/problem.php?id=1005 这里讲得挺清楚的:http://www.cnblogs.com/zhj5chengfeng/p/3278557.html 对于有n个节点的树: prufer数列和一棵树一一对应. prufer数列有n-2个元素 prufer数列的构造与解析: 构造:n-2步,每一步在树中查找度为1的点,并将这个点所在的边的另一个点放到prufer数列中,两个点的度均-1. 解析:将所有点的度赋值为1,然后将

【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$ 个数的序列. 生成方法:找到这棵树编号最小的叶子节点,将其

[HNOI2008]明明的烦恼

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

【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