そして、前回のテンプレートのタイトルに比べて、唯一のルートとするとき、パラメータのuを満たされた状態の数を決定するために、この関数は、この関数を完了した取引ができgetdisを変更している必要があります。2点間の距離が3で割り切れる場合はここでは問われます。そのため、3例だけで罰金の直接協議の数。
1、3つのカウントで割り切れるパス番号SUM0
2、SUM1によってカウント数よりもパス31に加え
3、数よりも通路32に加えて、SUM2によりカウント
最終的な答えは、SUM1 * SUM2 + SUM2 * SUM1 + SUM3 * SUM3 / N * Nその後、答えが何であるかを簡素化しています
#include <cstdioを> する#include <cstdlib> の#include <iostreamの> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#define MAXN 20002 の#define INF 2147483646 の#defineは長い長いllの 使用 名前空間STDを、 LL和[ 3 ]。 インラインint型 GI()// 输入挂 { int型の日付= 0、M = 1。CHAR CH = 0 。 しばらく!(CH = ' - '&&(CH < ' 0 ' || CH> ' 9 '))CH = GETCHAR()。 もし(CH == ' - '){M = - 1。CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 ' ) { 日付 =日付* 10 + CH- ' 0 ' 。 CH = GETCHAR()。 } 戻り日付*のM。输出挂 { 場合(QW < 0){のputchar(' - ')。QW = - QW;} もし(QW> 9)書き込み(QW / 10 )。 putchar(QWの%10 + ' 0 ' )。 } 構造体ノード{ int型に、次、LEN;} T [ 2 * MAXN + 5 ]。 int型のヘッド[MAXN + 5 ]。 INT SIM [MAXN + 5 ]、mxson [MAXN + 5 ]。 BOOL VIS [MAXN + 5 ]。 int型MX、根、Summar; LL ANS; int型N-、K、CNT、S; ボイド addedge(INT U、int型 V、int型 L)//は図保存 { CNT ++ ; T [CNT] .TO = V; Tが[ CNT] .next = 頭部[U]、 T [CNT] .LEN = L; 頭部[U] = CNT; 返す; } ボイド getRoot(INT U、int型 FA)を// 重力関数の中心を見つける { SIM [U] =を1 ; mxson [U] = 0; について(INT I =ヘッド[U]; Iは、I = T [I] .next) { int型 V = T [I] .TO; IF(FA == || VIS V [V])続行; getRoot( V、U) SIM [U] = SIM [U] + SIM [V]; mxson [U] = MAX(SIM [V]、mxson [U]); } mxson [U] = MAX(mxson [U] 、-S- SIM [U]); IF(mxson [U] <MX)= U {ルート; MX = mxson [U];} } ボイド getdis(INT Uは、int型 FA、int型)DISTを// 計算し、複数の統計点から条件を満たすサブツリーの場合にUがDISにメモリアレイを移動します { SUM [DIST%3。 ] ++ ; のための(int型 I =ヘッド[U]; I; I = T [I] .next) { int型 V = T [I] .TO; IF(VIS [V] || FA == V)続行; getdis(V、U、(DIST + T [I] .LEN)%3。); } リターン; } LL GCD(LL、LL B){ 戻り Bの== 0 A:GCD? (Bは、%B);} int型 consolate(INT STA、INT LEN1)// 現在の状況の数が条件を満たして計算する { SUM [ 0 ] = SUM [1 ] =和[ 2 ] = 0 。 getdis(STA、0 、LEN1)。 っ今 = 2 *和[ 1 ] *和[ 2 ] +和[ 0 ] *(和[ 0 ] - 1)+和[ 0 ]。 戻る今; } ボイド除算(INT TR)// 分治函数 { ANS = ANS + consolate(TR、0 ); VIS [TR] = 真; 用(int型 ; I; I =のI =ヘッド[TR] T [i]は.next) { INTのV =のT [i]は.TO。 もし(VIS [V])続けます。 ANSは =のANS - consolate(V、T [i]の.LEN)。 S =シム[V]。ルート= 0 ; MX = INF。getroot(V、0 ); 除算(ルート)。 } を返します。 } int型のmain() { int型Uを、V、L。 N = GI()。 CNT = 0 ; memsetの(頭、0、はsizeof (ヘッド))。 以下のための(int型 I = 1; iが<= N - 1。私は++ ) { U = GIを()。V = GI()。L = GI()。 addedge(U、V、L)。addedge(V、U、L)。 } ANS = 0 。 memsetの(VIS、0、はsizeof (VIS))。 MX = INF。S = N。getroot(1、0 ); 除算(ルート)。 LL GYZ = GCD(N * N、ANS)。 書き込み(ANS / GYZ)のputchar(' / ');(N / * N書き込みGYZ)。 リターン 0 ; }