【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)
2017-04-25 14:49
357 查看
1211: [HNOI2004]树的计数
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2468 Solved: 868
Description
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。Input
第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。Output
输出满足条件的树有多少棵。Sample Input
42 1 2 1
Sample Output
2HINT
Source
【分析】
无根树的表示法用prufer数列。【长姿势】
将树转化成Prufer数列的方法
一种生成Prufer序列的方法是迭代删点,直到原图仅剩两个点。对于一棵顶点已经经过编号的树T,顶点的编号为{1,2,...,n},在第i步时,移去所有叶子节点(度为1的顶点)中标号最小的顶点和相连的边,并把与它相邻的点的编号加入Prufer序列中,重复以上步骤直到原图仅剩2个顶点。例子
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Maxn 160 8 #define LL long long 9 10 int d[Maxn],cnt[Maxn]; 11 12 void cal(int x,int y) 13 { 14 for(int i=2;i*i<=x;i++) if(x%i==0) 15 { 16 while(x%i==0) cnt[i]+=y,x/=i; 17 } 18 if(x!=1) cnt[x]+=y; 19 } 20 21 int main() 22 { 23 int n; 24 scanf("%d",&n); 25 for(int i=1;i<=n;i++) scanf("%d",&d[i]); 26 if(n==1) 27 { 28 if(d[1]==0) printf("1\n"); 29 else printf("0\n"); 30 } 31 else 32 { 33 int sum=0; 34 for(int i=1;i<=n;i++) 35 { 36 if(d[i]==0||d[i]>=n) {printf("0\n");return 0;} 37 sum+=(--d[i]); 38 } 39 if(sum!=n-2) printf("0\n"); 40 else 41 { 42 for(int i=1;i<=n;i++) cnt[i]=0; 43 for(int i=2;i<=n-2;i++) cal(i,1); 44 for(int i=1;i<=n;i++) for(int j=2;j<=d[i];j++) cal(j,-1); 45 LL ans=1; 46 for(int i=1;i<=n;i++) while(cnt[i]--) ans=1LL*ans*i; 47 printf("%lld\n",ans); 48 } 49 } 50 return 0; 51 }
View Code
相关文章推荐
- [BZOJ1005][HNOI2008]明明的烦恼&&[BZOJ1211][HNOI2004]树的计数【prufer序列】
- 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
- [BZOJ1211][HNOI2004]树的计数(prufer序列+数学相关)
- [BZOJ1211][HNOI2004][prufer序列][排列]树的计数
- bzoj1211: prufer序列 | [HNOI2004]树的计数
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
- 【BZOJ1211】树的计数(HNOI2004)-Prufer序列+组合计数
- bzoj1211 [HNOI2004]树的计数 prufer序列
- [BZOJ1211][HNOI2004]树的计数(Prufer序列)
- 【BZOJ1211】【HNOI2004】树的计数 prufer序列
- bzoj 1211: [HNOI2004]树的计数 (prufer序列+组合数学)
- bzoj 1211: [HNOI2004]树的计数 -- purfer序列
- [Prufer] BZOJ 1211 [HNOI2004]树的计数
- bzoj1211 [HNOI2004]树的计数(prufer序列+组合数学+计数)
- 【prufer编码】BZOJ1211 [HNOI2004]树的计数
- BZOJ 题目1211: [HNOI2004]树的计数(组合数学,prufer)
- [bzoj]1211: [HNOI2004]树的计数
- BZOJ1211: [HNOI2004]树的计数
- BZOJ1211: [HNOI2004]树的计数