주제 링크 : https://nanti.jisuanke.com/t/41392
효과에 제목 : 루트에서 시작, 아버지의 노드에서 시작하는 트리의 깊이를 발견하고 그래서 확률은 각 자녀에 도달 정확한 깊이의 확률이 얻을 물어.
문제 해결 아이디어를 : DP 쓰기는 [유] 유를 루트로하는 서브 트리로 표시됩니다 질문은 유에서 알고리즘의 실행, 정확한 답을 얻을 수있는 확률을 표면하기 시작했다. U가 깊은 DP 잎 [유 = 1, 다른 DP [U] = 0을 남긴다. 전송하면, 확률이 될 수있다 생각하지 못한다.
DP는 [U]는 = 1- (1- (Σdp [V]) / CNT [U]) ^ CNT [U]. [CNT] 노드 번호 U U 자 노드.
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; 타입 정의 긴 긴 LL; CONST LL 모드 1E9 + = 7 ; CONST의 INT maxn 1E6 + = 5 ; 구조체 일 { INT , 다음에; STM} [maxn * 2 ]; INT의 어린 아이; INT의 헤드 [maxn]; 보이드 추가 ( INT U, INT V) { STM [TOT] .TO = V; STM [TOT] 다음 내용 = 헤드 [U]; 헤드 [U]는 ++ = TOT를 ; } LL의 qpow (LL의 N, LL의 m) { LL ANS = 1 ; 반면 (m) { 경우 (M 1 ) ANS ANS = N * % 개조; m / = 2 ; N = N * N 개의 %의 모드; } 반환 ANS; } INT의 증착 [maxn]; INT의 maxdep; INT DP [maxn]; INT CNT [maxn]; 보이드 dfs1 ( int로 U, INT의 FA) { DEP [U] = DEP [FA] + 1 ; maxdep = 최대 (maxdep, DEP [U]); ...에 대한( int로 I = 헤드 [U] ~ I, I = STM [i]는 다음 내용) { INT = 행 STM [I] .TO; 경우 (FA를 ==하기 위해) 계속 ; CNT [U] ++ ; dfs1 (U, 행); } 반환 ; } 공극 DFS2 ( int로 U, INT의 FA) { LL의 TEM = 0 ; 대 ( int로 I = 헤드 [U] ~ I, I = STM [i]는 다음 내용) { INT = 행 STM [I] .TO; 경우 (FA를 ==하기 위해) 계속 ; DFS2 (U, 행); TEM + =DP [을]; } 경우 (DP [U] == 0 ) { TEM = * TEM qpow (CNT [U] mod- 2 ) %의 모드; TEM = ( 1 -tem + 모드) %의 모드; DP [U] = ( 1 -qpow (TEM, CNT [U]) + 모드) % 개조; } } INT 의 main () { INT의 N; int로 U를 V; memset 함수 (머리 - 1 , 를 sizeof (헤드)); TOT = 0 ; scanf와 ( " %의 D ' , N); 대한 (값 int = 1을 1 ; i가 N <; 내가 ++ ) { 는 scanf ( " % d 개 %의 D를 " , U를, V); (U를 V)을 추가; 추가 (V U, 께); } dfs1 ( 1 , 0 ); 위한 ( int로 I = 1 ; i가 N = <; 내가 ++ ) { 경우 (DEP [I] == maxdep) { DP [I] = 1 ; } 다른 { DP [I] = 0 ; } } DFS2 ( 1 , 0); // COUT << maxdep << ENDL; // 대해 (나는 ++; i가 N = <I = 1 INT) (에서 printf " % LLD \ 없음 " , DP [ 1 ]); 반환 0 ; }