1005: [HNOI2008]明明的烦恼
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
1
-1
-1
Sample Output
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]明明的烦恼的更多相关文章
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )
首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...
- 【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4981 Solved: 1941 Description ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)
http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...
- 【BZOJ】1005: [HNOI2008]明明的烦恼(prufer编码+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1005 这里讲得挺清楚的:http://www.cnblogs.com/zhj5chengfeng/p ...
随机推荐
- 关于苹果出现NaN的情况----由Date格式解析方式不同引起的Bug
源于一个工作中遇到的问题:IOS 上时间显示为 NaN,而安卓上时间显示正常. 问题的根源在于 安卓 和 苹果 对于 JS Date 对象的不同解析. 安卓: new Date("2018- ...
- eclipse自动添加版权信息
Preference->Java->Code Style->Code Template->comments->Files->Edit 勾选上Automaticall ...
- HDU 4143 A Simple Problem 分解因式
求一个最小的正整数x,使得(y + x) (y - x) = n成立 考虑一下n的分解因式. 可能会想到枚举n的约数,那么a * b = n成立,取最小的x即可 但是要枚举到n / 2,这样会超时. ...
- Java面向对象_常用类库api——二叉树数据结构实现
二叉树是每个节点最多有两个子树的有序树.通常子树被称为"左子树"和"右子树". 二叉树算法的排序规则: 1.选择第一个元素作为根节点 2.之后如果元素大于根节点 ...
- Hadoop 解除 “Name node is in safe mode”(转)
运行Hadoop程序时,有时候会报以下错误: org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Na ...
- Hive:JDBC示例
1)本地目录/home/hadoop/test下的test4.txt文件内容(每行数据之间用tab键隔开)如下所示: [hadoop@master test]$ sudo vim test4.txt ...
- Comparing Two High-Performance I/O Design Patterns--reference
by Alexander Libman with Vladimir GilbourdNovember 25, 2005 Summary This article investigates and co ...
- mac-httpd
mac 的httpd mac 自带了apache2, 但是不推荐使用, 因为它的目录在/Library/WebServer/Documents/下 使用brew install apache-http ...
- <Win7硬件故障分析>
查看当前系统正在运行的硬件信息. 右击计算机——属性——设备管理器看到下面: 一些常见的硬件故障: 主板故障 >开机不正常,偶尔出现突然的断电现象 >明明自己选择了关机,但是还是无法关机或 ...
- orcale开篇
1.数据库系统和数据库的管理系统 数据库系统=数据库的管理系统+oper操作员+硬件2.Oracle的版本 8i/ 9i 10g/11g 12c(cloud)3.实例和数据库的关系 实例:数据 ...