AtCoder Principiante concurso 160 F - Distributing números enteros (prefijo producto, el cambio de la raíz)

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 ; 
}
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/starve/p/12626868.html
Recomendado
Clasificación