[cf715C]桁ツリー

現在の統計情報は、前のパスを検討し、すべてのパスとサブツリーマージ前風雲サブツリーに進み 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、000 );
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(10 );
94      のprintf(" %のLLD " 、ANS)。
95 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11254619.html