説明
明らかに学習されたツリーので、右奇妙生成関心のツリー......所与は、Nポイントに1の番号を付け、そしてせる最終度特定の点、
任意の2点間の接続であってもよいです何度ツリーの要件を満たすために生成されましたか?
入力
最初の動作N(0 <N <= 1000 )、
次のN行、行I + 1ジノードIの程度を与え、程度が必要とされない場合、入力-1
出力
ツリー満たし異なる要件、無溶液出力の数を表す整数0
サンプル入力
3
1
-1
-1
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)。)。 } }