トピックポータル
タイトル説明
N個のノードのツリーが、それは、i番目のノード次数で知られている、$ V_1、V_2、...、v_n $提供される各ノードが$ V_I $ $ $ D_Iあり、Qは異なるような条件を満足しますどのように多くの木の木。出力の$ D_ {v_iを} = D_I $木の数を満たすために必要なプログラミング、nは、$ D_1、D_2、...、d_n $を考えます。
入力形式
最初の行は、ツリーがn個のノードを有し、正の整数nです。第二行は、数nを有する、すなわち、i番目のツリーノード次数i番目の$ D_I $を、意味します。
出力フォーマット
出力はどのように多くの木ツリーの条件を満たすことができます。
サンプル
サンプル入力
4
2 1 2 1
サンプル出力
2
データ範囲とヒント
$ 1 \ leqslant n個の\ leqslant 150 $。
入力データが$ ^ {10} {17} $超えていないツリーの条件を満たしていることを確認してください。
問題の解決策
ボードは明らかに問題pruferシーケンス、程度であるn点は$ D_1のために決定され、無数木のD_2、... $ルート:!$ \ FRAC {(d_1-1){(N-2)} !\回(d_2-1)!\回...} $
しかし、その二つの特別な文に注意してください。
ツリーを満足する1は、$ \和\ limits_ {i = 1} ^ {n}はD_I = 2 \回N-2 $です。
2. $ N =扱うことが明らかに不便1 $は、1直接出力することができるとき。
直接の出力は「0」あなたが15分を持っていることを見つけるために愉快に驚かれることでしょう!
実装については、暴力のための高精密化に使用することができ、もちろん、品質係数の分解を使用することも可能で、後者は明らかに良好に達成しました。
コードの時間
#include <ビット/ STDC ++ H>
名前空間STDを使用して、
int型のn;
int型のD [151]。
INT、PRI [400] [400]を事前。
長い長いWZC [400]。
長い長いANS = 1LL。
空pre_work()//预处理质因数
{
(int型I = 2、iは<= 2 * N; I ++)のために
{
場合(PRI [i]が!)
{
PRI [I] = I;
事前[++プリ[0] = I。
}
のための(int型J = 1; J <=プレ[0]; J ++)
{
IF(予備[J]> PRI [I] || i *が予め[J]> n)を破ります。
PRI =前[J] [私は事前に[J] *]を。
}
}
}
長い長いQSM(長い長いX、長い長いY)
{
長い長いREC = 1。
一方、(Y)
{
IF(Y&1)REC * = X。
X * = X;
Y >> = 1。
}
REC返します。
}
int型のmain()
{
scanf関数( "%のD"、&N);
pre_work();
int型の合計= 0;
ブールフラグ= 0。
以下のために(iは++; iがn = <I 1は= INT)
{
scanf関数( "%のD"、&D [I])を、
IF(!D [i])とフラグ= 1。
和+ = D [i]は、
}
もし、(N == 1 && [1] D!){プット( "1"); 0を返す;}
もし(合計= 2 * N-2 ||フラグ!){プット( "0");戻り0; }特判が两个//
ための式(I = 1 int型、iが<= N-2、I ++)
{
int型フラグ= I。
一方、(フラグ> 1)
{
WZC [PRI [フラグ] ++;
フラグ/ = PRI [フラグ]。
}
}
のために(iは++; iがn = <I = 1 INT)
{
ため(int型のJ = 1; J <D [i]は、J ++)
{
一方(フラグ>
WZC [PRI [フラグ] - 。
フラグ/ = PRI [フラグ]。
}
}
}
のために(; iがn = <; I = 1 int型私は++)
IF(WZC [i])とANS = ANS * QSM(I、WZC [I]); //计算答案
のprintf( "%のLLD"、ANS );
0を返します。
}
RP ++