大学のオタクチャレンジカップ予選第2のフィールドC.異なる世界purferシーケンス+ファンタジーの第二種のスターリング数

問題の意味:Nポイントの所定の数は、すべての参照番号は無根ツリーのリーフノードを有する尋ねる構成するn個のノードの合計を表します。

 

すべての最初のシーケンスとpurfer、異なるpurfer配列とそれぞれが独自のツリーを構成表しに関する強いヒントを記述するために、「数字はルートレスツリーが持っている」、とこのシーケンスはに表示されませんでした数字の答えシーケンスの寄与に等しく、番号。

そして、私たちは、それぞれが正確に色のプログラムシーケンスのk個を登場見つけるために行くことができる、つまり、私たちは、このプログラムが正確にC(n、k)が* T(n、k)が* K!Tがある番号であることがわかります我々はNTTの畳み込みへの道を見つける必要がありnlogn第二種の第二のカテゴリー番号スターリング、スターリング番号が追求するボードを見つけることができます。

 

#include <ビット/ STDC ++ Hが>
 の#define LL長い長い
 使用して 名前空間STDを、
CONSTの INT N = 4E5 + 10 CONST LL P = 998244353、YG = 3 
LL N、FAC [N]、[N] INV、[N] F、G [N]、S2 [N]。
LLビン[N]。

LL電力(LLのX、LLのP){ 
    LLのRET = 1 (; P; P >> = 1 ){
         場合(P 1)RET =(RET * X)%のP。
        X =(X * X)%のP。
    } 
    戻りRET。
} 

ボイド NTT(LL *、LLのN、LLのOP){  // NTT:系数数组、长度为N、OP = 1つの求值OP = -1插值
    ため(LL i = 0 ; iがn <; I ++の)ビン[I] =(ビン[I >> 1 ] >> 1)|((I&1)*(nは>> 1 ));
    (LL i = 0 ; iがn <; iは++)場合(iは< ビン[i])とスワップ([I]、[ビン[I])。
    (LL i = 1 ; iがn <I << = 1 {)
        LL WN =パワー(YG、オペアンプ== 1?(P- 1)/(2 * I):( P- 1(P - ) - 1)/(2 * I))、T、W。
        (LL J = 0; J <N; jは+ = I << 1 ){ 
            W = 1 (LLのK = 0 ; K <iは、++ kは){ 
                tは =%のP wは* [Iがj + kは+]、W = W * WN%のP。
                [私は =(J + K] -t + P)%のP J + K +]; [J + K] =(J + K] + T)%Pと、
            } 
        } 
    } 
    もし(OP == - 1 ){ 
        LLのInv =力(N、P 2 )。
        以下のために(LL i = 0 ; iがn <; I ++)は、[I] [I] *のINV%の= Pと、
    } 
} 
長い 長い C(長い  N、長い  M){ 戻り FAC [N] * INV [M]%のP *のINV [nm]の%のPを;}
 int型のmain()
{ 
    CIN >> N。
    もし(N == 1 
    { 
        のprintf(" 1 \ n " );
        リターン 0 ; 
    } 
    であれば(N == 2 
    { 
        のprintf(" 2 \ n " );
        リターン 0 ; 
    } 
    FAC [ 0 ] = INV [ 0 ] = 1 にとってint型 i = 1 ; iが<= N; iが++)FAC [i]は= FAC [I- 1 ] * I%P、INV [I] =電力(FAC [i]は、P- 2 )。
    以下のためにint型 i = 0 ; iが<= N; iは++)F [i]は=(電源( - 1、I)+ P)%のP *はINV [I]%のP。
    int型 iは= 0 G [I] =電力(I、N-; iが<= N iが++)2)* [I]%のINV P。
    
    LL N = N- 1 ; 
    LL LEN = 1一方、(LEN <(N + 1)<< 1)LEN <<は= 1 ; 
    
    NTT(F、LEN、1); NTT(G、LEN、1 )。
    int型 I = 0を [I] =%のP([I] * G [i]がF)S2; iが++; iがLEN <)  // 求FG的卷积为S2 
    NTT(S2、LEN、 - 1 )。
    
    長い 長い ANS = 0 ;
    以下のためにint型 iは= 1 ; I <= N- 2、I ++ 
    { 
        長い  D = FACを[I] * S2 [i]は、
        Dの%= P。
        // のprintf( "%D%LLD%LLD \ n"は、NI、D、S2 [i])と; 
        ANS + = D * C(N、I)%のP×(NI)%のP。
        ANS%= P。 
    }
    年間%= P = P +年間、年=%のP; 
    printf(" %LLDの\ nを" 、年);
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/megalovania/p/11222009.html