bzoj1211: [HNOI2004]树的计数 prufer序列裸题

时间:2021-02-05 14:38:59

一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。

答案是(n-2)!/(a[1]-1)!/.../(a[n]-1)!,要特判一下不满足的情况和n==1的情况

/**************************************************************
Problem: 1211
User: walfy
Language: Java
Result: Accepted
Time:560 ms
Memory:17892 kb
****************************************************************/ import java.math.BigInteger;
import java.util.*; public class Main { public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int[] a = new int [];
boolean ok = true;
int sum=;
for(int i=;i<n;i++)
{
a[i]=cin.nextInt();
if(a[i] == )ok=false;
sum += a[i];
}
if(n==)
{
if(a[]==)System.out.println();
else System.out.println();
return ;
}
if(ok == false||sum != *n-)
{
System.out.println();
return ;
}
BigInteger [] b = new BigInteger [];
b[] = BigInteger.ONE;
for(int i=;i<;i++)
{
b[i]=b[i-].multiply(BigInteger.valueOf(i));
}
BigInteger ans = b[n-];
for(int i=;i<n;i++)
{
ans=ans.divide(b[a[i]-]);
}
System.out.println(ans);
}
}