bzoj1211 [HNOI2004]树的计数
2017-09-28 10:56
567 查看
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
2正解:$prufer$序列。
有一个结论,如果一个点的度数为$d$,那么它在$prufer$序列中出现$d-1$次。
知道这个以后我们就可以直接算了,$Ans=\frac{n-2!}{\prod_{(d-1)!}}$
注意两个细节,一是要分解质因数,二是要特判无解情况。
#include <bits/stdc++.h> #define il inline #define RG register #define ll long long using namespace std; int f[160][160],ans[160],d[160],vis[160],prime[160],n,cnt,sum; ll Ans; il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; } il ll qpow(RG ll a,RG ll b){ RG ll ans=1; while (b){ if (b&1) ans*=a; a*=a,b>>=1; } return ans; } il void sieve(){ for (RG int i=2;i<=n;++i){ if (!vis[i]) prime[++cnt]=i; for (RG int j=1,k;j<=cnt;++j){ k=i*prime[j]; if (k>n) break; vis[k]=1; if (i%prime[j]==0) break; } } return; } il void factor(RG int n){ RG int x=n; for (RG int i=1;i<=cnt;++i){ if (x%prime[i]) continue; while (x%prime[i]==0) x/=prime[i],++f [i]; } return; } il void add(int *a,RG int x,RG int v){ for (RG int i=1;i<=cnt;++i) a[i]+=v*f[x][i]; return; } int main(){ #ifndef ONLINE_JUDGE freopen("count.in","r",stdin); freopen("count.out","w",stdout); #endif n=gi(),sieve(),Ans=1; for (RG int i=1;i<=n;++i){ d[i]=gi()-1; if (d[i]<0 && n!=1) puts("0"),exit(0); sum+=d[i]; } if (sum!=n-2) puts("0"),exit(0); for (RG int i=2;i<=n;++i) factor(i); for (RG int i=2;i<=n-2;++i) add(ans,i,1); for (RG int i=1;i<=n;++i) for (RG int j=2;j<=d[i];++j) add(ans,j,-1); for (RG int i=1;i<=cnt;++i) Ans*=qpow(prime[i],ans[i]); cout<<Ans; return 0; }
相关文章推荐
- [bzoj]1211: [HNOI2004]树的计数
- 【bzoj1211】 HNOI2004—树的计数
- 【BZOJ】【1211】【HNOI2004】树的计数
- 【BZOJ1211】树的计数(HNOI2004)-Prufer序列+组合计数
- BZOJ 1211: [HNOI2004]树的计数 prufer编码
- bzoj 1211: [HNOI2004]树的计数
- 【BZOJ1211】【HNOI2004】树的计数 prufer序列
- [Prufer] BZOJ 1211 [HNOI2004]树的计数
- bzoj 1211: [HNOI2004]树的计数
- bzoj 1211[HNOI2004]树的计数
- 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)
- 4000 [BZOJ 1211][HNOI2004]树的计数(prufer编码+组合数学)
- 【bzoj1211】 [HNOI2004]树的计数
- BZOJ 题目1211: [HNOI2004]树的计数(组合数学,prufer)
- bzoj 1211: [HNOI2004]树的计数 -- purfer序列
- bzoj1211: prufer序列 | [HNOI2004]树的计数
- 【bzoj1211】 HNOI2004—树的计数
- BZOJ 1211: [HNOI2004]树的计数( 组合数学 )
- bzoj1211 [HNOI2004]树的计数 prufer序列+组合数
- [BZOJ1211][HNOI2004][prufer序列][排列]树的计数