bzoj1005

首先明确purfer序列可以与一棵树一一对应,purfer序列构造方法为,先选取一个编号最小的度数为1的点,然后删去该点,并将改点所连出的边指向的点加入purfer序列,直到最后该图中剩下最后两个点,那么n个结点的树对应的purfer序列的长度为n-2。那么数有多少种就可以转换成这个序列有多少种。该序列的性质:原图中每个节点的度数为在该序列中出现的次数+1……

   该题即转换成求purfer序列的个数。序列中非-1的节点位置的序列的个数可以由组合数算得,最后剩下的k个位置填num个-1的方案数即为k^num。

代码转载

import java.io.*;
import java.math.*;
import java.util.*;
public class Main
 {
     public static void main(String[] args){
         Scanner cin = new Scanner(new BufferedInputStream(System.in));
         int a[] = new int[1005];
         int n = cin.nextInt(),s = 0;
         for(int i = 1;i<=n;++i)a[i] = cin.nextInt();
         if(n==1){
             if(a[1]==0||a[1]==-1)System.out.println(1);
             else System.out.println(0);
             return;
         }
         int m = 0;
         for(int i = 1;i<=n;++i)if(a[i]!=-1){
             if(a[i]<1){System.out.println(0);return;}
             a[i]--;s+=a[i];m++;
         }
         if(s>n-2){System.out.println(0);return;}
         BigInteger f[] = new BigInteger[1005];
         f[1] = BigInteger.ONE;f[0] = f[1];
         for(int i = 2;i<=n;++i)
             f[i] = f[i-1].multiply(BigInteger.valueOf(i));
         BigInteger ans = f[n-2].divide(f[n-2-s]);
         BigInteger x = BigInteger.valueOf(n-m);
         for(int i = 1;i<=n;++i)if(a[i]!=-1)
             ans = ans.divide(f[a[i]]);  
         for(int i = 1;i<=n-s-2;++i)ans = ans.multiply(x);
         System.out.println(ans);
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值