P2634 [ナショナルチーム]コングコングココア
タイトル説明
コングコングとココアの兄弟、彼ら二人は、多くの場合、いくつかの雑用のために戦う、自宅などだけでアイスキャンデーが続くと、彼らの両方が食べたいが、2人はコンピュータを再生したい(しかし、彼らは唯一の自宅のコンピュータを持っています)... ...石はさみ布のように、一般的に、この問題が発生したが、彼らはすでに、このゲームに低IQをプレイするのに疲れています。
彼らの父親はすぐに彼らの論争の病気であることを、彼は新しいゲームを発明:父によって紙の上のn「ポイント」の絵、このn番目の「ポイント」だけのn-1「エッジ」との通信(実際には、これは)木です。そして、それぞれの上に番号がある「エッジを。」次に、点を選択したコングコング、ココア、続いて(もちろん、それらは木を見ることができない部位の選択)、ペナルティを全ての数字は、2点間のエッジまで追加した場合、3の倍数であることを起こりますコングコングは、そうでない場合はココアの勝利を獲得します。
コングコングは、それぞれのゲームは慎重に木を勉強します後、私は自分のためにどのくらいのこの絵の勝利の確率を知りたいのですが、考えるのが大好き。今、あなたは、コングコングの答えが正しいことを確認するには、この値を見つけるのに役立ちます。
入力形式
第一の入力線は、正の整数nを含みます。三つの整数のX、YのN-1後部ラインは、Wは、xはエッジ点と点の数yが存在する間の数を表し、上記の番号は、Wです。
出力フォーマット
すなわち、出力確率(A及びBが1の確率に素数でなければならない、すなわち、「/ B」の形、出力「1/1」)、約分数で。
サンプル入力と出力
5
1 2 1
1 3 2
1 4 1
2 5 3
13/25
説明/ヒント
[サンプル記述]
13は、ポイントに設定されている(1,1)(2,2)(2,3)(2,5)(3,2)(3,3)(3,4)(3,5)(4,3 )(4,4)(5,2)(5,3)(5,5)。
[データ]スケール
データの100%に、N <= 20000。
ゾル:DPツリーも点在させることができる(前に書かれた長い時間(霧、DP [I] [J]私は番号をルートとするサブツリー内で発現されるI%I = J、及び
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedef int型LL。 インラインLLリード() { LL S = 0。BOOL F = 0。CHAR CH = ' ' ; しばらく(!isdigit(CH)){F | =(CH == ' - '); CH = GETCHAR();} ながら(isdigit(CH)){S =(S << 3)+(S << 1)+(CH ^ 48)。CH = GETCHAR();} リターン(F)(? - S):( S)。 } の#define R(x)は、x =リード() インラインボイドライト(LLのX) { 場合(X < 0){のputchar(' - ')。X = - X;} もし(X < 10){のputchar(X + ' 0 ')。返す;} 書き込み(X / 10)。putchar((X%10)+ ' 0 ' )。 } の#define W(x)は書き込み(X)のputchar( ' ') の#define WL(X)の書き込み(X)のputchar('の\ n') のconst int型 N = 20005、M = 40005 。 整数 nは、DP [N] [3 ]、ANS = 0 。 INT TOT = 0 、次に[M]、[M]に、ヴァル[M]、ヘッド[N]。 インラインボイドリンク(int型のx、int型の Y、int型 Z){次に[++ TOT =頭部[X]。【TOT = Yであり; ヴァル[TOT = Z。ヘッド[X] = TOT;} インラインボイド DFS(int型のx、int型脂肪) { int型、E、I、Jを、 DP [X] [ 0 ] = 1。DP [X] [ 1 ] = DP [X] [ 2 ] = 0 。 以下のための(;; E E =次の[E] E =ヘッド[X])の場合([E] =へ!脂肪) { DFS([E]に、X)。 用(i = 0 ; iは< 3 ; iは++ ) { ANS + = DP [X] [I] * DP [乃至[E]] [(6 -i-VAL [E])%3 ] * 2 。 } のための(i = 0 ; iは< 3 ; iは++ ) { DP [X] [(iは +ヴァル[E])%3 ] + = DP〔に[E] [I]。 } } // COUT << X << ' '<< DP [X] [0] <<' '<< DP [X] [1] <<'' << DP [X] [2] << ENDL ; } int型のmain() { int型I、X、Y、Z。 用(i = 1 ; iがn <; iは++ ) { R(X)R(Y)。Z =リード()%3 。リンク(X、Y、Z)。リンク(X、Y、Z)。 } DFS(1、0 ); ANS + = N。 int型 GG = __ GCD(N * N、ANS)。 書き込み(ANS / GG); putchar(' / '); WL(N * N / GG)。 リターン 0 ; } / * 入力 5 1 2 1 1 3 2 1 4 1 2 5 3 出力 13/25 * /
書式#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間はstdを、 CONSTの INT N = 20005、M = 40005、INF = 0x3f3f3f3f 。 int型 N、RE = 0、TOT = 0、次に[M]、SZ [M]、ヴァル[M]、ヘッド[M]、RT、和、[N]、PP [N]、ARR [N]に、トング[ 3 ]、GG。 インラインボイド追加(int型のx、int型の Y、int型 Z){次に[++ TOT =頭部[X];ヴァル[TOT] = Z;頭部[X] = [TOT]は、Y =にTOT;} インラインINTを GCD(int型のx、int型の Y){ リターン(Y ==0)、X:GCD(Y、Xの%のY);} インラインボイド getrt(int型のx、int型FA) { int型のI。SZ [X] = 1。PP [X] = 0 ; 以下のための(I =ヘッド[X]; I; I = 次に[I]) { もし {getrt([I]に対して、X)(ARR [する[I] &&に[I] = FA!)。SZ [X] + = SZ [i]を[します]。PP [X] = MAX(PP [x]は、SZ [する[I]);} } PP [X] = MAX(PP [x]は、和-PP [X])。もし(PP [X] <PP [RT])RT = X。 } インラインボイド DFS(int型のx、int型 FA、INT PRE) { トング[事前]++; int型私は、 用(; I I = I =ヘッド[X] 次に[I]) { 場合(に[I] = FA && ARR [する[I]]!)DFS([i]は、xに、(事前+ヴァル[I])%3 )。 } } インラインボイド CALC(int型のx、int型 OP、INT V) { トング[ 0 ] =トン[ 1 ] =トン[ 2 ] = 0。DFS(X、0、v%と3)。+ =オペアンプ*再(2 *トン[ 1 ] *トン[ 2 ] +トン[ 0 ] *トン[ 0 ] +トン[ 1] +トン[ 2 ])。 } インラインボイドは(解決INT X) { int型私は、ARR [X] = 1。計算値(X、1、0 ); 以下のための(I =ヘッド[X]; I; I = 次に[I]) { 場合(!ARR [する[I]]) { CALC([I]に - 1、ヴァル[I])。和= SZ [i]を[します]。PP [RT = 0 ] = INF。getrt([I]に、0 ); (RT)を解きます。 } } } int型のmain() { int型 I、X、Y、Z。scanf関数(" %d個"、&N)。和= PP [RT = 0 ] = N。 用(i = 1 ; iがn <; iは++ ) { scanf関数(" %D%D%D "、およびX&Y、およびZ)。(x、y、z)を加えます。(Y、X、Z)を追加します。 } getrt(1、0); (RT)を解きます。GG = GCD(RE、N * N)。printf(" %D /%D \ n "、RE / GG、N * N / GG)。 }