bzoj 1211
prufer序列:
参考链接:http://hzwer.com/3272.html
证明:一个序列必定对应着一棵合法的树
假设共有n个点,编号从1到n:
首先,n个点之间连了n-1条边;
其次,证,n个点之间不会出现环:假设环中最后添加进来的一条边是a,b,与a相连的另一个点是c,与b相连的另一个点是d,假设a是从x中选出来的,b是从y中选出来的,可知,a,c这条边中的a只能是从y中选出来的,b,c这条边中的b只能是从y中选出来的,所以c,d必定是从x中选来的,这个环继续延伸,必定会出现一条边两个点都要从y中选出来,这是不可能的,所以一定不会出现环。
综上所述,由特定数组成的序列和合法的树一一对应。
所以这道题最后演化成求一串数的排序方式。
用java交题,不用加包(否则会re),并且类名是Main.(经过后续验证,不加包反而会ce,加了包才能ac,前一段时间得到的结果怎么和现在的差距这么大呢?)
代码参考:http://www.cnblogs.com/zhj5chengfeng/p/3278557.html
(周日打完比赛,自己一个人去吃了一小份鸡公煲,感觉学校里的鸡公煲,嗯,是肉,就没有更深一层的味道了,还是酸梅汤比较好喝,但是卫生?亲眼目睹的一幕,还是有点无法接受)
import java.math.BigInteger; import java.util.*; public class Main { static Scanner in=new Scanner(System.in); static int N=160; static int[] num=new int[N]; static int n; static int a; static int sum; static boolean pd=true; static BigInteger ans=new BigInteger("1"); static BigInteger temp=new BigInteger("1"); static BigInteger now=new BigInteger("1"); static BigInteger addnum=new BigInteger("1"); static public void main(String args[]){ n=in.nextInt(); for(int i=0;i<=n;i++){ num[i]=0; } for(int i=1;i<=n;i++){ a=in.nextInt(); if(a<0||a>n-1){//判断该能不能构成树。 pd=false; } else{ if(a==0){//当一棵树只有一个点时,度数可以有0,但是如果大于一个点时就不能存在度数为0的点,所以这点要单独拿出来判断。 pd=false; } sum+=a; num[a]++; } } in.close(); if((n!=1&&pd==false)||sum!=(2*n-2)||(n==1&&num[0]==0)){ System.out.println("0"); } else if(n==1&&num[0]!=0){ System.out.println("1"); } else{ for(int i=1;i<=n-2;i++){ ans=ans.multiply(now); now=now.add(addnum); } now=now.subtract(now); now=now.add(addnum); for(int i=1;i<=n-1;i++){ temp=temp.multiply(now); now=now.add(addnum); for(int j=1;j<=num[i+1];j++){ ans=ans.divide(temp); } } System.out.println(ans); } } }