AtCoder初心者コンテスト160 F - 配布整数(製品プレフィックス、ルート変更)

タイトル: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(10 ); 
    DFS2(1 01 )。
    以下のためにINT iが= 1 ; I <= N; I ++ 
        のprintf(" %のLLD \ n " 、ANS [I])。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/starve/p/12626868.html