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;
typedef long long ll;
struct abcd{
    ll xx[400];
    int cnt;
    abcd(int x=0)
    {
        memset(xx,0,sizeof xx);
        xx[1]=x;
        cnt=1;
    }
    ll& operator [] (int x)
    {
        return xx[x];
    }
}ans(1);
abcd operator *= (abcd &x,abcd &y)
{
    int i,j;
    abcd z;
    for(i=1;i<=x.cnt;i++)
        for(j=1;j<=y.cnt;j++)
            z[i+j-1]+=x[i]*y[j],z[i+j]+=z[i+j-1]/100000000,z[i+j-1]%=100000000;
    z.cnt=x.cnt+y.cnt;
    if(!z[z.cnt])
        --z.cnt;
    x=z;
}
ostream& operator << (ostream& os,abcd &x)
{
    int i;
    printf("%lld",x[x.cnt]);
    for(i=x.cnt-1;i;i--)
        printf("%08lld",x[i]);
    return os;
}
int n,m,remain,cnt[M],stack[M],top;
void Decomposition(int x,int y)
{
    int i;
    for(i=2;i*i<=x;i++)
        while(x%i==0)
            cnt[i]+=y,x/=i;
    if(x^1)
        cnt[x]+=y;
}
void Quick_Power(int i,int y)
{
    abcd x(i);
    while(y)
    {
        if(y&1)ans*=x;
        x*=x;
        y>>=1;
    }
}
int main()
{
    int i,x;
    cin>>n;remain=n-2;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==-1)
            ++m;
        else if(x>1)
            stack[++top]=x-1,remain-=x-1;
    }
    for(i=2;i<=n-2;i++)
        Decomposition(i,1);
    while(top)
    {
        for(i=2;i<=stack[top];i++)
            Decomposition(i,-1);
        stack[top--]=0;
    }
    for(i=2;i<=remain;i++)
        Decomposition(i,-1);
    Decomposition(m,remain);
    for(i=1;i<=n;i++)
        if(cnt[i])
            Quick_Power(i,cnt[i]);
    cout<<ans<<endl;
}  

时间: 2024-10-16 23:18:04

BZOJ 1005 明明的烦恼(prufer序列+高精度)的相关文章

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

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

【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数列)

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

BZOJ 1005 明明的烦恼 (组合数学)

题解:n为树的节点数,d[ ]为各节点的度数,m为无限制度数的节点数. 则             所以要求在n-2大小的数组中插入tot各序号,共有种插法: 在tot各序号排列中,插第一个节点的方法有种插法: 插第二个节点的方法有种插法: ......... 另外还有m各节点无度数限制,所以它们可任意排列在剩余的n-2-tot的空间中,排列方法总数为 根据乘法原理: #include <cstdio> #include <cmath> int n,m,tot,i,j,d,down

[BZOJ]1005 明明的烦恼(HNOI2008)

BZOJ的第一页果然还是很多裸题啊,小C陆续划水屯些板子. Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1. Output 一个整数,表示不同的满足要求的树的个数,无解输出0. Sample Input 3 1 -1 -1 Sampl

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】无根树的Prufer数列

今天看了Prufer数列这个东西. 每一个Prufer数列和无根树是一一对应的.所以求出有多少符合要求的Prufer数列即可. 点i在Prufer数列中的出现次数为i的度数 - 1. 代码如下:[用分解质因数的方法,避免了高精除] #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <iostream> using namesp

【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序列 大数

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行