CF1151Fソニアと情報(確率の期待、DP、高速電力行列)

明らかに、水問題の結果はカイを削減しませんでした...... ......

最初の注文番号の$ C $の$の$シーケンスは0で、その後、ソート順序は確かにフロント$ 0 $ $ $ cは、リアNC $ $ $ 1 $。

DPにすることができますので。(実際には......ここで立ち往生)

$ C $の数は$ $ $ 0 $ Jプログラムの数を持って前に$ F [i]の[j]は$ $ I $は、操作の後に示しています。答えは$ \ dfrac {F [k]は[C]} {\和F [k]は[I]} $です。

この利点は、状態を直接、次の値が得られることです。

  • $ C $数は1 $ $ $ $ CJの数である前に、
  • $ $ CJに$ C $ $ $ 0番号の後に数
  • $ C $ $ 1から$ N-2C + J $の数の数後(したがって$ J \ GE 2C-Nの$)

初期状態:$ CNT $数の$ $ $ 0 Cフロント$における初期シーケンス順序番号[0] [CNT = 1 $、他の$ F [0] [i]は= 0 $ F次に$。

転送:

$$ F [I] [J] + = F [I-1]〜[J](\ dfrac {C(C-1)} {2} + \ dfrac {(NC)(NC-1)} {2} J(CJ)+(CJ)(N-2C + j)を)+ $$

第NCは$交換を$後に第1のブラケットは、第三の第四$ 1、$の前に、目の前にし、$ $ $ 0 $ 0交換前後$ Cは$交換されます背後にある$ 1 $交換。

$$ F [I] [J] + = F [I-1] [J-1](C-J + 1)^ 2 $$

$ C $ 0 $の前と$ 1 $の$ $ $内の1つの為替NCにした後。

$$ F [I] [J] + = F [I-1] [J + 1](J + 1)(N-J + 1 + 2C)$$

$ C $ 1 $前面と$ 0 $ $ $交換で$ NCのリア。

そして、ディスカバリー$ I $層と$ I-1 $関連の層が、それはすぐに電源行列にすることができます。

時間複雑$ O(nは^ 3 \ログK)$。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONST  INT MAXN = 101、= MOD 十億七#define <;(私は++ =(B)(I、B)iは=(A)INT)用のため
 の#define ROF(I、B)(I =(A)がINTのための; I => (B); i--)
 の#define MEM(X、V)のmemset(X、V、はsizeof(x))を
インラインINT 読み出す(){
     CHAR CH = GETCHAR()。INT X = 0、F = 0 一方、(CH < ' 0 ' || CH> ' 9 ')は、f | = CH == ' - '、CH =getchar関数();
    一方、(CH> = ' 0 ' && CH <= ' 9 ')、X = X * 10 + CH- ' 0 '、CH = )(GETCHAR。
    リターン?F - X:X; 
} 
int型N、K、[MAXN]、C、CNT。
インラインINTは(追加INT A、INT B){ 返す:+ B-か?A + B <MOD A + B ; MODを} 
インラインint型のサブ(INT A、INT B){ 戻り?<B-B + MODを:A- B;} 
インラインINT MUL(INTint型 B){ 戻り 1LL * B型%の、MOD} 
インラインINT qpow(INT A、INT B){
     int型 ANS = 1 (; B; B >> = 1、A = MUL(A))であれば(B&1)ANS = MUL(ANS、A)。
    戻るANSを。
} 
構造体行列{
     INT [MAXN] [MAXN]。
    行列(){MEM(0 );} 
    マトリックス演算子 *(CONST行列&T)のconst { 
        マトリックスANS。 
        (iについて、 0、C)が(K、0、C)(Jについては0、C)ans.a [I] [J] = [((ans.a [I]、[J]、MULを追加I] [K]、TA [K] [J]))。
        戻るANSを。
    } 
} BEG、FAC、ANS。
マトリックスqpow(マトリックスint型B){ 
    マトリックスANS。
    FOR(I、0、C)ans.a [i]は[I] = 1 (; B; B >> = 1、A = A * A)であれば(B&1)ANS = ANS * 戻るANSを。
} 
int型のmain(){ 
    N = read()は、K = リード(); 
    (I、FOR 1、N)[i]を読み出す=()、C + =![I]。
    FOR(I、1、C)CNT + =![I]。
    beg.a [CNT] [ 0 ] = 1 
    (I、FOR 0 、C){ 
        fac.a [i]は[I] =(1LLの* Cは*(C- 1)/ 2 + 1LL *(NC)*(NC- 1)/ 2 + 1LL * i *が(CI))%MOD。
        もし(iは> = 2 * CN)fac.a [i]は[I] =追加(fac.a [I] [I]、MUL(CI、N- 2 * C + I))。
        もし(i)はfac.a [i]は[I- 1 ] = MUL(C-I + 1、C-I + 1 )。
        もし(私!= C && I + 1 > =2 * CN)fac.a [I] [I + 1 ] MUL(I + = 1、N- 2 *のC + I + 1 )。
    } 
    ANS = qpow(FAC、K)* BEG。
    int型 S = 0 ; 
    FOR(I、0、C)S =追加(S、ans.a [I] [ 0 ])。
    S = MUL(qpow(S、mod- 2)、ans.a [C] [ 0 ])。
    printf(" %d個の\ n " 、S); 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/1000Suns/p/11116040.html