您的位置:首页 > 其它

BZOJ1211: [HNOI2004]树的计数

2014-09-18 13:25 323 查看

1211: [HNOI2004]树的计数

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1245 Solved: 383
[Submit][Status]

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

4

2 1 2 1

Sample Output

2

HINT

Source

组合数学

题解:

prufer序列裸题吧。。。

一直交上去0ms WA,实在受不鸟了交了lyd的代码。。。

代码:

mine

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,c[200],i,j,sum;
long long ans;

int main()
{
freopen("input.txt","r",stdin);

freopen("output2.txt","w",stdout);
cin>>n;
if(n==1) {cin>>m; if(m) cout<<0<<endl; else cout<<1<<endl; return 0;}
for(i=1;i<=n;i++)
{
scanf("%d",&m);
if(m<1||m>n) {cout<<0<<endl; return 0;}
sum+=m-1;
for(j=2;j<m;j++) c[j]++;
}
m=n-2;
if(sum!=m) {cout<<0<<endl; return 0;}
ans=1;
for(i=2;i<=m;i++)
{
ans*=i;
for(j=2;j<n;j++)
while(c[j]&&ans%j==0) c[j]--,ans/=j;
}
cout<<ans<<endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: