bzoj 1211: [HNOI2004]树的计数
2017-10-10 17:11
417 查看
题意:
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。题解:
prufer序列然后就挺有思路了。
就阶乘乘一乘,除一除,简单的组合数学。
注意下无解情况:
1:n!=1&&d[i]==0
2:∑d[i]−1!=n−2
code:
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #define LL long long using namespace std; int n,d[155],sum=0; int cnt[155]; void Decomposition(int x,int c) { int i; for(i=2;i*i<=x;i++) while(x%i==0) cnt[i]+=c,x/=i; if(x^1) cnt[x]+=c; } LL quick(LL a,int b) { LL ans=1; while(b) { if(b&1) ans*=a; a*=a;b>>=1; } return ans; } int main() { scanf("%d",&n); for(int i=2;i<=n-2;i++) Decomposition(i,1); for(int i=1;i<=n;i++) { scanf("%d",&d[i]); if(n!=1&&d[i]==0) {printf("0\n");return 0;} sum+=d[i]-1; for(int j=2;j<d[i]-1;j++) Decomposition(j,-1); } LL ans=1; if(sum!=n-2) {printf("0\n");return 0;} for(int i=2;i<=n-2;i++) if(cnt[i]) ans*=quick((LL)i,cnt[i]); printf("%lld",ans); }
相关文章推荐
- BZOJ 题目1211: [HNOI2004]树的计数(组合数学,prufer)
- 【BZOJ 1211】 [HNOI2004]树的计数
- 【BZOJ1211】【HNOI2004】树的计数
- 【bzoj1211】 HNOI2004—树的计数
- [Prufer] BZOJ 1211 [HNOI2004]树的计数
- bzoj1211: prufer序列 | [HNOI2004]树的计数
- 【BZOJ1211】树的计数(HNOI2004)-Prufer序列+组合计数
- 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)
- 4000 [BZOJ 1211][HNOI2004]树的计数(prufer编码+组合数学)
- BZOJ1211 - [HNOI2004]树的计数
- bzoj 1211: [HNOI2004]树的计数 -- purfer序列
- bzoj1211 [HNOI2004]树的计数(prufer序列+组合数学+计数)
- [BZOJ1005][HNOI2008]明明的烦恼&&[BZOJ1211][HNOI2004]树的计数【prufer序列】
- 【BZOJ1211】【HNOI2004】树的计数 prufer序列
- BZOJ 1211: [HNOI2004]树的计数( 组合数学 )
- BZOJ1211: [HNOI2004]树的计数
- bzoj1211: [HNOI2004]树的计数
- BZOJ1211: [HNOI2004]树的计数
- 【bzoj1211】 HNOI2004—树的计数
- bzoj 1211: [HNOI2004]树的计数