明らかに、水問題の結果はカイを削減しませんでした...... ......
最初の注文番号の$ 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(INT、int型 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); }