[BZOJ-1005&羅区P2624] [HNOI2008]明らかにトラブル - [シーケンス] PY + JavaのPurfer

トピックリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=1005
羅区:https://www.luogu.com.cn/problem/P2624
制限時間:1秒   メモリ制限:162メガバイト
羅区:制限時間1.00s  メモリ制限の125.00メガバイト

説明

  明らかに学習されたツリーので、右奇妙生成関心のツリー......所与は、Nポイントに1の番号を付け、そしてせる最終度特定の点、
任意の2点間の接続であってもよいです何度ツリーの要件を満たすために生成されましたか?

入力

  最初の動作N(0 <N <= 1000 )、
次のN行、行I + 1ジノードIの程度を与え、程度が必要とされない場合、入力-1

出力

  ツリー満たし異なる要件、無溶液出力の数を表す整数0

サンプル入力

3
1
-1
-1

サンプル出力

2

ヒント

  2つのツリーは1-2-3であり、1-3-2


 

そうむき出しでない質問であるPurferシーケンス2004を、裸に比べて。

K知られている程度を考慮して、我々は自然Purfer配列に依存回答の知らKを取得することができます:

 だから、その答えの一部は次のようになります。

 しかしながら、N-2 purferの要素があるので、これらの要素を配置するの合計は、C(N-2、和)種を有する、すなわち、最終的な答えの部分:

 残りの頂点の残りの部分は、NK、予備配列N-2-和位置であるが、各頂点は吐出方法、のN-2和を有します

その答えのようなもの。

そして、最終的な答えが出てきます。

 

 emmmm、またはPY + JAVA波はそれを振ります。

(パイソン):以下は、ACコードです

N = INT(入力()) = []
 のための I における範囲(N):
    a.append(INT(入力()))
の合計 = 0、K = 0
 のための I における範囲(N):
     もし [I !] = - 1 
        合計 + = [I] -1 
        K + = 1
     のelif [I] == 0:
         プリント(0)
        の出口()

C = 1
 のための I における範囲(N-2-和+ 1 、N-2 + 1 ):
    C * =  I における範囲(2、和+ 1つの):
    C // = I 

TOT = 1 
、F = [1 ]
 のための I における範囲(1、和+ 1 ):
    TOT * = iは
    f.append(F [I -1] * I)
 のために I における範囲(N):
     もし [I] = - 1!
        TOT // = F [i]が-1 ] 

最後の = 1 ;
 I における範囲(N-2- 和):
    最後 * =(N- K)

プリント(C * TOT *最後)

 

(Javaコード):

インポートがjava.math.BigInteger;
インポートjava.util.Scanner; 

クラスメイン{
     公共 静的 ボイドメイン(文字列[]引数){ 
        スキャナSC = 新しいスキャナ(System.in)。
        INT、N = sc.nextInt()。
        int型 [] = 新しい int型 [1005 ];
        int型のマーク= 0、和= 0、K = 0 以下のためにINT I 1 =; I <= N; I ++ ){ 
            [I] = sc.nextInt()。
            もし([I] == 0)マーク= 1 もし(![I] = - 1 ){ 
                合計 + = [I] -1; K ++ 
            } 
        } 
        もし(マーク== 1 ){ 
            するSystem.out.println( "0" )。
            でSystem.exit( 0 ); 
        } 
        のBigInteger S = 新規のBigInteger( "1" )。
        BigIntegerのNUM [] = 新しい BigIntegerの[1005 ]。
        NUM [ 0] = 新規のBigInteger( "0" )。
        INT MX = N。
        もし(合計> N)MX = 和。
        にとってINTは I = 1; I <= MX; I ++ 
            NUM [I] = NUM [I-1] .add(新規のBigInteger( "1" ));
        INT I = N-2、I> = N-2-和+ 1; i-- 
            S = s.multiply(NUM [I])。
        以下のためにINT ; I <=和;私は2 = I ++ 
            S = s.divide(NUM [I])。
        BigIntegerのTOT = 新しいのBigInteger( "1" );
        以下のためにINT ; I <=和; iが1 = I ++ 
            TOT = tot.multiply(NUM [I])。 
        BigIntegerの[] F =新しい BigIntegerの[1050 ]; 
        F [ 0] = 新規のBigInteger( "1" )。
        以下のためにINT I = 1; I <= N; I ++ 
            F [I] = F [I-1 ] .multiply(NUM [I])。
        BigIntegerのCNT = 新しいのBigInteger( "1" );
        以下のためにINT I 1 =; I <= N; I ++ 場合([I] = - 1!)CNT = cnt.multiply(F [i]が-1 ])。
        最後のBigInteger = 新しいのBigInteger( "0" );
        以下のためにINTI = 1; I <= NK。I ++)最後の=は(last.add新しいのBigInteger( "1" )); 
        BigIntegerのtot_last = 新しいのBigInteger( "1" );
        以下のためにINT I 1 =; I <= N-2-和; I ++)tot_last = tot_last.multiply(最後)。
        System.out.println(s.multiply(tot.divide(CNT))、乗算(tot_last)。)。
    } 
}

 

 

 

 

おすすめ

転載: www.cnblogs.com/lonely-wind-/p/12189938.html