Título: https://atcoder.jp/contests/abc160/tasks/abc160_f
Significado de las preguntas: Dado un árbol, preguntando a cada nodo para iniciar una clasificación topológica de la cantidad;
Análisis: Toda la situación es n! , Que luego tiene que escoger los requisitos legales como clasificación topológica, es necesario para el primer nodo de la raíz, por lo que es de SZ [u] para seleccionar un programa, es decir, multiplicado por C (SZ [u], 1) para cada recursión nodo también cuando una situación tal. Así que realmente quiere mantener el tamaño de la parcela es el prefijo de cualquiera.
#include <bits / STDC ++ h.> usando espacio de nombres std; #define raíz LSON << 1, l, midd #define raíz rson << 1 | 1, midd + 1, r # define pb push_back typedef largo tiempo ll; const int M = 1E6 + 6 ; const int mod = 1e9 + 7 ; vector < int > g [M]; ll FACN = 1 ; int n; ll ans [M], sz [M], mul [M], fac [M]; ll KSM (ll a, ll b) { un % = mod; ll t = 1; mientras que (b) { si (b & 1 ) t = t * a% mod; un = a * a% mod; b >> = 1 ; } Devolver t; } Void dfs1 ( int u, int fa) { sz [u] = mul [u] = 1 ; para (auto v: g [u]) { si (! v = fa) { dfs1 (v, u); sz [u] + = sz [v]; mul [u] = mul [u] * mul [v]% mod; } } mul [u] = mul [u] * sz [u]% mod; } Void dfs2 ( int u, int fa, ll durar) { ll tmp = última; para (auto v: g [u]) si (! v = fa) tmp * = mul [v], tmp% = mod; ans [u] = FACN * KSM (tmp, mo- 2 )% mod; para (auto v: g [u]) si (! v = f bis) el pasado * = mul [v], la última% = mod; para (auto v: g [u]) si (v =! f bis) dfs2 (v, u, última * KSM (mul [v], mo- 2 )% mod * (n-sz [v])% mod); } Int main () { scanf ( " % d " , y n); para (ll i = 2 ; i <n; i ++ ) FACN * = i, FACN% = mod; para ( int u, v, i = 1 ; i <n; i ++ ) { scanf ( " % d% d " , & u, y v); g [u] .pb (v); g [v] .pb (u); } Dfs1 ( 1 , 0 ); dfs2 ( 1 , 0 , 1 ); para ( int i = 1 ; i <= n; i ++ ) printf ( " % LLD \ n " , ans [i]); volver 0 ; }