一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。
标签:
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。
第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。
输出满足条件的树有多少棵。
#include<cstdio>
using namespace std;
int n,tot,p[2][151],x;
long long ans(1);
void cal(int x,int k)
{
for (int i=2;;i++)
{
if (x%i==0) while (x%i==0) {p[k][i]++;x/=i;}
if (x==1) break;
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
if (x>2)
{
for (int j=1;j<=x-1;j++) cal(j,1);
}
if (x>1) tot+=x-1;
}
if (n==1) {printf("%d",!x);return 0;}
if(tot!=n-2) {printf("0");return 0;}
for (int i=2;i<=tot;i++) cal(i,0);
for (int i=1;i<=150;i++)
if (p[0][i]-p[1][i]>0)
for (int j=1;j<=p[0][i]-p[1][i];j++)
ans*=(long long)i;
printf("%lld",ans);
}版权声明:本文为博主原创文章,未经博主允许不得转载。
【bzoj1284】【HNOI2004】【树的计数】【组合数学+prufer数列】
标签:
原文地址:http://blog.csdn.net/sunshinezff/article/details/48133895