タイトル:https://atcoder.jp/contests/abc160/tasks/abc160_f
質問の意味:木を考えると、どのように多くのトポロジカル整列を開始するために、各ノードを尋ねます。
分析:全体的な状況はnです!、それはSZからのものであるので、次にトポロジカルソートなどの法的要件を選択する必要があり、それは、ルートへの最初のノードのために必要とされる[U]番組を選択する、すなわち、C(SZ [U]、1)を乗じました各ノードの再帰のためのときにもこのような状況。だから、本当にプロットの大きさは、いずれかの接頭辞である維持する必要があります。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define LSON根<< 1、L、midd の#define rsonルート<< 1 | 1、midd + 1、R の#define PB一back typedefの長い ロングLL。 CONST INT M = 1E6 + 6 。 const int型 MOD = 1E9 + 7 。 ベクター < INT > G [M]。 LL FACN = 1 。 int型のn; LL ANS [M]、MUL SZ [M]、[M]、FAC [M]。 LL KSM(-1,11,11- b)は{ A%= MOD。 LLトン = 1; 一方、(b)は、{ もし、(B&1 ) T = T *%のMOD。*%の= MODを。 B >> = 1 。 } 戻りT。 } ボイド DFS1(INT U、INT FA){ SZ [U] = MUL [U] = 1 。 用(オートV:G [U]){ 場合(!V = FA){ DFS1(V、U)。 SZ [U] + = SZ [V]。 MUL [U] = MUL [U] * MUL [V]%のMOD。 } } MUL [U] = MUL [U] * SZ [U]%のMOD。 } ボイド(DFS2 INT U、INT {FA、LL最後) LL TMP = 最後; 用(オートV:G [U]) であれば(!V = FA) TMP * = MUL [V]、TMP%= MOD; ANS [U] = FACN * KSM(TMP、mod- 2)%のMOD。 用(オートV:G [U]) であれば(!V = FA) 最後 * = MUL [V]、最後の%= MOD; 用(オートV:G [U]) の場合(V =! FA) DFS2(V、U、最後 * KSM(MUL [V]、mod- 2)%MOD *(N-SZ [V])%のMOD)。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のための(iは= LL 2 ; N I <; I ++ ) FACN * = I、FACN%= MOD。 以下のために(INT U、V、Iは= 1 ; I <N; I ++ ){ scanf関数(" %D%D "、&U、およびV)。 G [U] .pb(V)。 G [V] .pb(U)。 } DFS1(1、0 ); DFS2(1、 0、1 )。 以下のために(INT iが= 1 ; I <= N; I ++ ) のprintf(" %のLLD \ n " 、ANS [I])。 リターン 0 ; }