熟練したスプリット?どのような地獄、私は、タイトルを読んだ後徹底を受けた、ああ学んだことがない、これが道であることは所望のタイトルの確率は、決定的に負け、最終的には、背中のトピックに、15ポイントを騙し、すべての最初は、それを与えるためにどのような問題の意味、理解しましたそれぞれの親は、異なる重量配分の息子の各確率こと、ツリー全体、どのくらいの光側を通って行くためにカウントアップ、最終カウントが、言ってこの最もを通じてツリーのどのくらいの光側の期待を要求され、その後、重い息子を選択します光側には、いくつかの面を上にした後、この下の需要が起こるかの確率を乗じましたか?どうやら木DP
彼は最終的には、分子分母の逆数を乗じたとして、我々はプログラム番号を設定するための確率を、設定しないので、プログラムの数は、全体のツリーが、我々はグラムを設定するいくつかのプログラムを使用する必要が確率である課す[I] [0 / 1] [j]は、i番目の親ノードを示し、軽鎖の最も長い長さの息子に先行する番組jの数であり、0が0/1の代表であり、息子は、先太りすぎから選択されていません息子、[X] [j]は、X最長の長軽鎖プログラム番号jをルートとするサブツリーを表し、fは選挙に代わって1が、重すぎる息子されている、のは、どのように転送考えてみましょう
転送確かにキャリアとしてDFSで、我々は今、xのi番目の息子にその検索を前提とし、その後、最長Jの旧I-1軽鎖長の息子は、軽鎖の最長長さがkのi番目の息子で、その後、 (ケース0と1)が存在します
G [i]が[0] [MAX(J、K + 1)] + = G [I-1] [0] [j] * F [i]が[K] ----(1)
G [I] [1]〜[MAX(J、K + 1)] + = G [I-1] [1]〜[J] * [I] F [K] ----(2)
G [I] [1]〜[MAX(j、k)は] + = G [I-1] [0] [j] * F [i]が[K] ----(3)
息子は、光の息子であることを証明する、私たちはこの息子に電流が息子を再表示されませんでした最初の式、を見て、実際には非常によく理解され、これらの3つの転送方程式を見て、その後、彼の父親への彼の貢献はする必要があります彼自身の軽鎖の長さ+ 1、彼はまた、軽鎖父に行ってきましたので、これに乗って、実際には、十分に理解が、私は、長い時間のために捕まってしまった秘密のおかげで私の友情の一例を与えるとitawbmは私のクラスメートを解決スター付き問題は、実際には、あなたがカウントされているため、それは、大きなK + 1大型またはJであるかどうかは、プログラムの数なので、いくらあなたmaxよりも小さい数が少ない、彼は2のように、この最大値に私を構成します、5,8,9は、2つの数の最大値は、限り、あなたは9を選択すると、残りの数は重要ではありませんが、彼らはさまざまなプログラムなので、これは場所を取ることであることを、9であることを確認するために、2つの数値を選択します
第二に、そこにあなたは、i番目の息子はすでに息子を見ていたまで知っているか、その息子を再i番目の再息子ではありませんので、私は息子言うべき重量のための3つの式は、あるので、我々はすべきそれは再息子の前に現れた場合は2例との違いは、というxのi番目の息子の寄与であり、それは私番目とXとの明るい面の息子で、その貢献ながら、両方のケースであることを指摘それは、i番目の再やる息子の息子である、そうでも彼とX側との間での貢献を構成していない場合のk + 1が、必要とされます
この場合、伝達方程式が終わっ、この質問はまた、空間Gスクロールアレイの使用を最適化し、その後サイクルを減少させるために各ポイント、jおよびkのそれサブツリー深さを記録することができ
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <ベクトル> 4の#include <CStringの> 5 の#define MAXN 3010 6 の#defineっ長い長い 7 使って 名前空間STD。 8 CONST 長い 長 MOD = 1E9 + 7 。 9 int型N、根。 10 LL NY、ANS、TOT = 1 。 11 INT FA [MAXN]、深い[MAXN]。 12 LL ZZ [ 2 ] [ 2 ] [MAXN]、[MAXN] [MAXN]フェン。 13ベクター< INT> 息子[MAXN]。 14 (LL B LL)のLL KSM 15 { 16 = 11ファン1。=%のMOD。 17 一方、(B> 0 ) 18 { 19 であれば(B&1)ファン=(ファン* A)%MOD。 20 B = B >> 1。=(* A)%MOD。 21 } 22 リターンファン%のMOD。 23 } 24の 空隙 DFS(INT X) 25 { 26 であれば(息子[X] .size()== 0){FEN [X] [ 0 ] = 1。 戻り}; 27 のために(int型 I = 0 ; I <息子[X] .size(); ++ i)は{ int型 LS =息子[X] [I]; DFS(LS)。深い[X] = MAX(深い[x]は、深い[LS] + 1 );} 28 INT CUR = 0 。 29 のmemset(ZZ、0、はsizeof (ZZ))。 30 のための(int型 J = 1 ; J <=深い[X]; ++ J){ZZ [CUR] [ 0 ] [J] = FEN [息子[X] [ 0 ] [J- 1 ]。ZZ [CUR] [ 1 ] [J] = FEN [息子[x]は[ 0] [J];} 31 ZZ [CUR] [ 1 ] [ 0 ] = FEN [息子[X] [ 0 ] [ 0 ]。 32 INT MAXX =深い[息子[X] [ 0 ] + 1 。 33 のために(int型 I = 1 ; I <息子[X] .size(); ++ i)は 34 { 35 CUR = CUR ^ 1。memsetの(ZZ [CUR]、0、はsizeof (ZZ [CUR]))。 36 のために(INT J = 0 ; J <= MAXX; ++ j)は 37 のために(INT K =0 ; K <=深い[息子[X] [i]は]; ++ K) 38 { 39 ZZ [CUR] [ 0 ] [MAX(J、K + 1)] =(ZZ [CUR] [ 0 ] [マックス(J、K + 1)] +(ZZ [CUR ^ 1 ] [ 0 ] [j] * FEN [息子[X] [I] [K])%のMOD)%MOD。 40 ZZ [CUR] [ 1 ] [MAX(J、K + 1)] =(ZZ [CUR] [ 1 ] [MAX(J、K + 1)] +(ZZ [CUR ^ 1 ] [ 1 ] [J] * FEN [息子[X] [I] [K])%のMOD)%MOD。 41 ZZ [CUR] [ 1 ] [MAX(J、K)=(ZZ [CUR] [ 1] [MAX(J、K)] +(ZZ [CUR ^ 1 ] [ 0 ] [j] * FEN [息子[X] [I] [K])%のMOD)%MOD。 42 } 43 MAXX = MAX(MAXX(深い[息子[X] [I] + 1 ))。 44 } 45件 のmemcpy(FEN [X]、ZZ [CUR] [ 1 ]、はsizeof(ZZ [CUR] [ 1 ]))。 46 } 47 のint main()の 48 { 49 のscanf(" %d個"、&N) 50 のために(int型 I = 1 ; ++; iが<= N I) 51 { 52 int型秒; scanf関数(" %のD "、&S)。 53 もし(!S = 0)TOT =(TOT *(LL)S)%のmod。 54 のために(INT J = 1 {++ J; J <=秒)INT。scanf関数(" %のD "、&A); FA [A] = I。息子[I] .push_back(A);} 55 } 56 のための(int型 I = 1 ; I <= N; ++ I) 57 であれば(FA [I] == 0)ルート= I。 58の DFS(ルート)。 59 NY = KSM(TOT、mod- 2 )。 60 のために(INT J = 0 ; J <=深い[ルート]; ++ j)はANS =(ANS +(フェン[ルート] [J] * J)%のMOD)%MOD。 61 のANS =(ANS * NY)%MOD。 62 のprintf(" %LLDする\ n " 、ANS)。 63 リターン 0 ; 64 }