Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 6539  Solved: 2558
[Submit][Status][Discuss]

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-2

首先要知道 Prufer数列 和 节点度数 这种东西,自行Google。

Plufer数列有一下性质:

1、可以表示为任意一个长度为n-2的数列

2、任意一点的度数为d[i],则该节点在数列中出现d[i]-1次

3、因此数列的总长度为:

\[sum=\sum _{i=1}^{n} (d[i]-1)\]

得出这个总长度的前提是,所有度数已知,但题目并没有给出所有的度数。但是我们可以计算出已知n个点的度数,可以构造出多少种Prufer数列:

\[\frac{(n-2)!}{\prod _{i-1}^{n}(d[i]-1)!}\]

那么已知cnt个点的度数,可以构造出多少种Prufer数列呢?

\[C_{n-2}^{sum}\times \frac{sum!}{\prod _{i-1}^{n}(d[i]-1)!}\]

那么已知cnt个点的度数,n-cnt个点的度数未知,可以构造出多少种Prufer数列呢?

\[ans=C_{n-2}^{sum}\times\frac{sum!}{\prod _{i-1}^{n}(d[i]-1)!}\times(n-cnt)^{n-2-sum}\]

最终可以化简得:

\[ans=\frac{(n-2)!}{(n-2-sum)!\prod _{i-1}^{n}(d[i]-1)!}\times(n-cnt)^{n-2-sum}\]

沿用了之前高精度乘除单精度的模板,减少代码量(明明是增加了)

虽说质因数分解更能显示bigger。。。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std; const int MAXN=;
const int DLEN=;
const int WIDE=;
class BigNum
{
public:
int NUM[MAXN];
int L;
bool flag;
BigNum(){memset(NUM,,sizeof(NUM));L=;flag=;}
BigNum(const BigNum &T){memcpy(NUM,T.NUM,sizeof(NUM));L=T.L;flag=T.flag;}
BigNum(int n){memset(NUM,,sizeof(NUM));NUM[]=n;L=;while(NUM[L-]>=WIDE){NUM[L]+=NUM[L-]/WIDE;NUM[L-]%=WIDE;L++;}flag=;}
}; void Output(const BigNum T)
{
if(T.flag==) cout<<'-';
cout<<T.NUM[T.L-];
for(int i=T.L-;i>=;i--)
{
cout.width(DLEN);
cout.fill('');
cout<<T.NUM[i];
}
} BigNum Mult(const BigNum A,int B)
{
BigNum C(A);
int i,tmp,k=;
for(i=;i<C.L||k;i++)
{
tmp=C.NUM[i]*B+k;
k=tmp/WIDE;
C.NUM[i]=tmp%WIDE;
}
C.L=i;
return C;
} BigNum Div(const BigNum A,int B)
{
BigNum C(A);
int k=;
for(int i=C.L-;i>=;i--)
{
k=k*WIDE+C.NUM[i];
C.NUM[i]=k/B;
k%=B;
}
while(C.NUM[C.L-]==) C.L--;
return C;
} int n,sum,cnt;
int d[];
bool flag;
BigNum ans(); int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&d[i]);
if(d[i]==||d[i]>n-) flag=;
if(d[i]==-) continue;
sum+=d[i]-;
cnt++;
}
if(n==)
{
if(d[]==||d[]==-) printf("1\n");
else printf("0\n");
return ;
}
if(n==)
{
if((d[]==||d[]>)&&(d[]==||d[]>)) printf("1\n");
else printf("0\n");
return ;
}
if(flag)
{
printf("0\n");
return ;
}
for(int i=n--sum;i<=n-;i++)
ans=Mult(ans,i);
for(int i=;i<=n--sum;i++)
ans=Mult(ans,n-cnt);
for(int i=;i<=cnt;i++)
for(int j=;j<=d[i]-;j++)
ans=Div(ans,j);
Output(ans);
return ;
}

1005: [HNOI2008]明明的烦恼的更多相关文章

  1. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

    题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...

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

    1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

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

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  4. BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )

    首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...

  5. 【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4981  Solved: 1941 Description ...

  6. BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5786  Solved: 2263[Submit][Stat ...

  7. BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合

    1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...

  8. bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)

    [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5907  Solved: 2305[Submit][Status][Di ...

  9. BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 这里讲得挺清楚的:http://www.cnblogs.com/zhj5chengfeng/p ...

随机推荐

  1. Node.js实现TCP和HTTP并作简单的比较

    TCP和Node 传输控制协议是一个面向连接的协议,换句话说,它是一个传输层的协议,它主要的职务呢,就是确保信息传输的正确性. 我们使用的很多如HTTP协议都是基于TCP的,为什么呢?因为我们不希望传 ...

  2. 聊聊tcpdump与Wireshark抓包分析

    1 起因# 前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况.这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了.在排查 ...

  3. 使用spring boot admin

    spring boot admin管理端, 需要部署成独立的应用 pom中添加依赖 <dependency> <groupId>de.codecentric</group ...

  4. mfc 列表控件

    经常使用的mfc控件:list control,记录下   首先将list control拖入到对话框中,然后命名ID,通过类向导,类型为control,控件变量名(m_showlist),  vie ...

  5. FFmpeg编译i386 OSX 脚本

    话不多说, 直接上脚本 #!/bin/sh # directories PLATFORM="OSX" # FFmpeg脚本目录 SOURCE="ffmpeg-2.8.7& ...

  6. 服务器部署nginx报错 nginx: [warn] conflicting server name "localhost" on xxx.xxx.xxx.xxx:80, ignored

    问题 修改nginx配置参数后,使用nginx -t检查配置. 提示successfull后就可以使用 nginx -s reload来重新加载配置 我配置的过程中遇到这样的问题,就是绑定了主机名后, ...

  7. [luogu 3369]普通平衡树(fhq_treap)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  8. UICollectionView笔记2

    WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts 这是博主的WWDC2012笔记系列中的一篇 ...

  9. 【干货】Html与CSS入门学习笔记1-3

    从23号开始用了4天时间看完了<Head First Html与CSS>这本书,本书讲解方式深入浅出,便于理解,结合习题,便于记忆,是一本不错的入门书.下面是本书的学习笔记: 一.认识HT ...

  10. MvvmCross框架在XamarinForms中的使用入门

    做XamarinForms快一年了,最近趁着项目不是很紧,有点空闲的时间,研究了一下MvvmCross这个框架,感觉挺高大上的.一边研究一下写点入门的东西吧,大部分的东西github都有. 1添加Pa ...