現在の統計情報は、前のパスを検討し、すべてのパスとサブツリーマージ前風雲サブツリーに進み X- 、の電流経路Y- $ X \ CDOT 10 ^ {LENである最終的な答え、 (Y)} \当量0( MOD \ P)$ 、xが$ \当量-Y / 10 ^ {LEN(Y)}(MOD \ P)$に変換され、現在のそれぞれに対して、 Y 問い合わせの前に、Xの持つ数(地図)に注意を払うことができます読書と逆読みの違いを避けます。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4の#include <地図> 5 使って 名前空間STDを、 6 の#defineっ長い長い 7 の#define MAXN 100001 8 の#define PD(!エッジ[I] .TO = FA)&&(!VIS [エッジ[I] .TO]) 9マップ< 整数、整数 > マット、MAT2。 10 構造体JI { 11 のint NEX、LEN、であり; 12 }エッジ[MAXN << 1 ]。 13 LLのE、N、M、X、Y、Z、ANS、ヘッド[MAXN]、POW [MAXN]、SIZ [MAXN]、NY [MAXN]。 14 BOOL VIS [MAXN]。 15 ボイド追加(int型のx、int型の Y、int型Z){ 16 エッジ[E] .nex = 頭部[X]。 17 エッジ[E] .TO = Y。 18 エッジ[E] .LEN = Z。 19 頭[X] = E ++ 。 20 } 21 のLL KSM(LL N、LLさt){ 22の 場合(tは!)を返す1LLと、 23 LL S = KSM(N、T >> 1 )。 24 S、S = sの*%のM。 25 であれば(T&1)S = sの* N%のM。 26 リターン秒; 27 } 28 int型のサイズ(int型 K、INT FA){ 29 SIZ [K] = 1 。 30 のためには、(int型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[i]は.nex) 31 であれば(PD)SIZ [K] + = 大きさ(エッジ[I] .TO、K)。 32 戻りSIZ [K]。 33 } 34 INTクエリ(INT K、int型の FA、int型N){ 35 のint MA = 0 、P。 36 のために(int型 I = - ; I =ヘッド[k]は!1 ; iが= エッジ[i]は.nex) 37 であれば(PD) 38 であれば(P =クエリ(エッジ[I] .TO、K、N))リターンP。 39 他 MA = MAX(1LL * MA、SIZ [エッジ[I] .TO])。 40 MA = MAX(1LL * MA、N- SIZ [K])。 41 であれば(MA <= N / 2)リターンK。 42 リターン 0 ; 43 } 44 空隙 CALC(int型 K、INT FA、int型のDEP、LL S、LLのS2){ 45の ANS + =マット[(M-S2 * NY [++ DEP]%のM)%のM] +MAT2 [S]。 46 のために(int型 - ;!I = I =ヘッド[k]を1 ; I = エッジ[I] .nex) 47 であれば(PD)計算値(エッジ[I] .TO、K、DEP、(S +エッジ[I ] .LEN * POW [DEP])%のM、(S2 * 10 +エッジ[I] .LEN)%のM)。 48 } 49 空隙 TOT(int型 K、INT FA、int型のDEP、LL S、LLのS2){ 50 マット[S] ++ ; 51 MAT2 [(M-S2 * NY [++ DEP]%のM)%のM] ++ ; 52 のために(int型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[I] .nex) 53 もし(PD)TOT(エッジ[I] .TO、K、DEP、(S +エッジ[I] .LEN * POW [DEP])%のM、(S2 * 10 +エッジ[I] .LEN)%のM)。 54 } 55の 空隙 DFS(int型 K、INT FA){ 56 のint R = クエリ(K、FA、サイズ(K、FA))。 57 mat.clear()。 58 mat2.clear()。 59 マットは、[ 0 ] MAT2 [= 0 ] = 1 。 60 のためには、(int型 I =ヘッド[R];!I = - 1 ; I = エッジ[i]は.nex) 61 であれば(PD){ 62 CALC(エッジ[I] .TO、R、0、エッジ[I] .LEN、エッジ[I] .LEN)。 63 TOT(エッジ[I] .TO、R、0 、エッジ[I] .LEN、エッジ[I] .LEN)。 64 } 65 VIS [R] = 真を。 66 のために(int型 - ;!I = I =ヘッド[R] 1 ; I = エッジ[i]は.nex) 67 であれば(PD)のDFS(エッジ[I] .TO、R)と、 68 VIS [R] = 偽。 69 mat.clear()。 70 mat2.clear()。 71 マットは、[ 0 ] MAT2 [= 0 ] = 1 。 72の TOT(K、FA、0、0、0 ); 73 VIS [R] = 真。 74 } 75 INT メイン(){ 76 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 77 のscanf(" %のLLDの%のLLD "、&N、&M)。 78 のために(int型 i = 1 ; iがN <; Iは++ ){ 79 のscanfを(" %LLD%LLD%LLD "、およびX&Y、およびZ)。 80 Z%= M。 81 (++ X、++追加Y、Z)。 82 (Y、X、Z)を追加します。 83 } 84 X = Y = M。 85 のためには、(int型 iは= 2 iが++; 1LL * iが<= M * ) 86 場合(Yの%I == 0 ){ 87 、X = X iが(I-* / 1 )。 88 一方、(Yの%のI == 0)Y / = I。 89 } 90 であれば(Y> 1)、X = X / Y×(Y- 1 )。 91 のために(int型 I = 0 ; iが<= N; iが++)POW [I] = KSM(10 、I)。 92 のための(int型私= 0 ; iがn = <; iは++)NY [I] = KSM(POW [i]は、X- 1 )。 93の DFS(1、0 ); 94 のprintf(" %のLLD " 、ANS)。 95 }