[2018チームジョブ]リピータ - 生成部ルート関数反転+

フェイス質問

  UOJ#450

解決

  $ M $ここによって元のタイトルに$ K $を示し、

  {!\製品版のT_I} $$ \合計は_ {\ sum_ {iは1} ^ mt_i = = N} \ FRAC {N!} \ PROD [:$私は$回T_I番目のリピータリピート$を$、最終的な答えはに等しく、処分さD |!T_I] \\ = N \総和_ {\ sum_ {i = 1} ^ mt_i = N} \ PROD \ FRAC {[D | T_I]} {!T_I} $$

  構造生成機能$ A(X)= \ sum_ {i = 0} ^ {\ inftyの} [D | I] {!I} \ FRAC {1}のx ^ I $、次に答えは$ A ^ M $ A $に等しいです。 $ N!$を乗じたN $倍係数

  用单位根反演化简$ A(X)$:$$開始\ {ALIGN *} A(X)&= \ sum_ {I = 0} ^ {\ inftyの} [D | I] \ FRAC {1} {私!}のx ^私\\&= \ sum_ {i = 0} ^ {\ inftyの} \ FRAC {X ^ I} {私!} * \ FRAC {1} {D} \ sum_ {J = 0} ^ {D-1} w_d ^ {IJ} \\&= \ FRAC {1}、{D} \ sum_ {J = 0} ^ {D-1} \ sum_ {I = 0} ^ {\ inftyの} \ FRAC {(w_d ^ J)^ I} {I!} X ^ I \\&= \ FRAC {1}、{D} \ sum_ {J = 0} ^ {D-1} E ^ {w_d ^ JX} \端{ALIGN *} $$

  $$ A ^ M = \ FRAC {1} {D ^ M}(\ sum_ {J = 0} ^ {D-1} E ^ {w_d ^ JX})^ M $$

  $ $ D = 1、答えは$ M ^ N $です

  $ D = 2 $时、$$ \ {ALIGN *}を始めるA ^ M&= \ FRAC {1} {D ^ M}(\ sum_ {J = 0} ^ {D-1} E ^ {w_d ^ JX} )^ M \\&= \ FRAC {1} {2 ^ M}(E ^ {W_2 ^ 0X} + E ^ {W_2 ^ 1X})^ M \\&= \ FRAC {1} {2 ^ M} \ sum_ {i = 0} ^ {M} \ binom {M} {I} E ^ {(W_2 ^ 0I + W_2 ^ 1(MI))X} \端{ALIGN *} $$

    答案为:$$ \開始{ALIGN *}回答&= N * \ FRAC {1} {2 ^ M} \ sum_ {I = 0} ^ M \ binom {M} {I} \ FRAC {(W_2 ^ 0I + W_2 ^ 1(MI))^ n}は{N!} \\&= \ FRAC {1} {2 ^ M} \ sum_ {I = 0} ^ M \ binom {M} {I}(W_2 ^ 0I + W_2 ^ 1(MI))^ N \端{ALIGN *} $$

  $ D = 3 $时、$$ \ {ALIGN *}を始めるA ^ M&= \ FRAC {1} {D ^ M}(\ sum_ {J = 0} ^ {D-1} E ^ {w_d ^ JX} )^ M \\&= \ FRAC {1} {3 ^ M}(E ^ {w_3 ^ 0X} + E ^ {w_3 ^ 1X} + E ^ {w_3 ^ 2×})^ M \\&= \ FRAC {1} {3 ^ M} \ sum_ {i = 0} ^ {M} \ sum_ {J = 0} ^ {MI} \ binom {M} {I} \ binom {MI} {J} E ^ {( w_3 ^ 0I + w_3 ^ 1J + w_3 ^ 2(MIJ))X} \端{ALIGN *} $$

    答案为:$$ \開始{ALIGN *}回答&= N * \ FRAC {1} {3 ^ M} \ sum_ {I = 0} ^ M \ sum_ {J = 0} ^ {MI} \ binom {M } {I} \ binom {MI} {J} \ FRAC {(w_3 ^ 0I + w_3 ^ 1J + w_3 ^ 2(MIJ))^ n}は{N!} \\&= \ FRAC {1} {3 ^ M} \ sum_ {I = 0} ^ M \ sum_ {J = 0} ^ {MI} \ binom {M} {I} \ binom {MI} {J}(w_3 ^ 0I + w_3 ^ 1J + w_3 ^ 2 (MIJ))^ N \端{ALIGN *} $$

  ユニットルート$ w_d ^ 1 = G ^ {\ FRAC {MOD-1}、{D}} $、$ G $ $ MOD $は、この問題の原始根が$ 7 $に等しくなります

  $ O(M ^ {D-1} \ Nログ)$

 コード:

#include <cstdioを> 
する#include <iostreamの> 
する#include <アルゴリズム> 
の#include <CStringの>
 使用して 名前空間をSTD。
typedefの長い 長いLL。
const  int型のmod = 19491001 ; 

INT追加(int型のx、int型Y)
{ 
    リターン X + Y <MOD?X + Y:X + Y - MOD。
} 

int型 RDC(int型のx、int型のY)
{ 
    リターン X - Y < 0X - Y + MOD:X - Y。
} 

、LL X(qpowちゃいますINTのY)
{ 
    LL RET = 1 一方、(Y)
    { 
        場合(Y&1 
            RET = RET * X%MOD。
        X = X * X%MOD。
        Y >> = 1 
    } 
    戻りRET。
} 

int型N、M、D。

名前空間D2 {
     ボイドワーク()
    { 
        LL ANS = 0、MUL = 1 以下のためのint型 I = 0; I <= M。++ i)が
        { 
            ANS =追加(ANS、qpow(RDC(2 * I、M)、N)* MUL%MOD)。
            MUL =(MUL *(M - I)%のMOD)* qpow(I + 1、MOD - 2)%MOD。
        } 
        のprintf(" %のLLD "、ANS * qpow(qpow(2、M)、MOD - 2)%のMOD)。
    } 
} 

名前空間D3 { 
    LL C [ 1005 ] [ 1005 ]。

    ボイドのinit()
    { 
        INT I =0 ; I <= M。++ I)
        { 
            C [i]が[ 0 ] = 1 ;
            INT J = 1 ; J <= I; ++ j)は
                C [I] [J] =追加(C [I- 1 ] [J- 1 ]、C [I- 1 ] [J])。
        } 
    } 

    ボイドワーク()
    { 
        INIT()。
        LL W1 = qpow(7、(MOD - 1)/ 3)、W2 = W1 * W1%MOD、ANS = 0 以下のためのint型 I =0 ; I <= M。++ I)
             のためにint型 J = 0 ++; J <= MI J)
                ANS =追加(ANS、(C [m]は[I] * C [MI] [J]%のMOD)(qpow * ( - I - Iは、(W1 * J%MOD、W2 *(M追加J)%のMOD))を追加し、N)%のMOD)。
        printf(" %のLLD "、ANS * qpow(qpow(3、M)、MOD - 2)%のMOD)。
    } 
} 

int型のmain()
{ 
    scanf関数(" %D%D%D "、&​​N、&M、&D)。
    もし(D == 1 
    { 
        のprintf(" %のLLD " 、qpow(M、N))。
        リターン 0 ; 
    } 
    もし、(D == 2 
        D2 ::ワーク(); 
    他の
        D3 ::作品(); 
    リターン 0 ; 
}
コードの表示

おすすめ

転載: www.cnblogs.com/Joker-Yza/p/12641667.html