CF1194Fクロスワードエキスパート(数論、組合せ論)

難しい問題ありません。私がなぜでき$ 2500 $を知らない......

しかし、裁判所は間違っては、最適化されたプッシュしないだろう......

最初の$のf_i $を考えてみましょうまさに私が$ -question $の前に行われる確率を表します。

それが困難カウントするように作ります。変更し、$のf_i $少なくとも$ -question $私は完成する確率を表します。

答えは$ \和\ limits_ {i = 0} ^ NI(のf_i-F_ {I + 1})= \ \ limits_ {i = 1} ^ nf_i $和。

それぞれの質問のみを1秒以上を使用することができますので、私は正確にSB $ jの$時間確率の質問に$最初の$のための$ DP [I] [J] $を考えます。

初期状態は$ DP [0] [0] = 1 $。転送は$ DPである[I] [J] = \ dfrac {1} {2}(F [I-1]〜[J] + F [I-1] [J-1])$。

式を凝視すること$ DP [I] [J] =(\ dfrac {1} {2})^ iは\ dbinom {I} {J} $を参照することは容易である参照。実際の意味を理解することは困難ではありません。

(フィールドが押された場合$(\ dfrac {1} {2})^ {iが+ Jを}になる\ dbinom {iが+ J} {I} $ ......自己閉鎖オン)

次に= \和\ limits_ {J = 0} ^ {R_iを} DP [I] [J] =(\ dfrac {1} {2})^ iは\和\ limits_ {J = 0} ^ {R_iを$のf_iあります} \ dbinom {I} {J} $。$ R_iと= T- \和の\ limits_ {J = 1} ^ it_j $、SBは、最大許容回数を表します。(あなたがなぜ考えることができ、$ I $と$ \分$を取るために、実際には、しかし、影響しません)

質問はlimits_ {J = 0} ^ {R_iと} \ dbinom {I} {jは} $ \ $ \総和を求めています。次の非常に素晴らしい習慣です。

直接の暴力ときに最初の$ I = 1 $。

その後、$ \和\ limits_ {J = 0} ^ {R_iを} \ dbinom {I + 1} {J} = \和\ limits_ {J = 0} ^ {R_iを}(\ dbinom {I} {J} + \ dbinom {I} {J-1})= 2 \和\ limits_ {J = 0} ^ {R_iを} \ dbinom {I} {J} - \ dbinom {I} {R_iを} $。直接再帰。

$ $は単調減少R_iをので、ラインの組み合わせの再帰の$ R_ {I + 1} + 1 $の完了後$ $ R_iをに番号が削除されます。

リトルは、優れたの$ O(n)は$を達成するために行うことができます。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 200020、MOD = 十億七、INV2 = 500000004 ;
#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))を
インライン読み取り11(){ 
    LL、X = 0、F = 0チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9')は、f | = CH == ' - '、CH = GETCHAR()。
    一方、(CH> = ' 0 ' && CH <= ' 9 ')、X = X * 10 + CH- ' 0 '、CH = )(GETCHAR。
    リターン?F - X:X; 
} 
int型、T [MAXN]、FAC [MAXN]、[MAXN] INV = [MAXN]、ANS、プロF、[MAXN] invfac N 1 
【MAXN] R LL。
INT C(INT N、LLのM){
     場合(N <M)戻り 0 ;
    戻り 1LL * FAC [N] * invfac [M]%MOD * invfac [nm]の% MOD。
} 
INT {main()の
    N =(読み取り)であり; Rは、[ 0 ] = 読み取ります(); 
    (Iについては1、n)がT [I] = 読み取ります(); 
    (I、FOR 1、n)がR [I] = R [I- 1 ] - T [i]は、
    FAC [ 0 ] = FAC [ 1 ] = INVを[ 1 ] = invfac [ 0 ] = invfac [ 1 ] = 1 
    (I、FOR 2 、N){ 
        FAC [i]は = 1LL * FAC [I- 1 ] * I%MOD。
        INV [I] = MOD-1LL×(MOD / I)* INV [MOD%I]%MOD。
        invfac [I] =μlの* invfac [I- 1] * INV [I]%のMOD。
    } 
    FOR(I、0、分(1LL、R [ 1 ]))F [ 1 ] =(F [ 1 ] + C(1、i))を%MOD。
    (I、FOR 2 、N){
         場合(R [i]が< 0ブレーク
        F [I] =(2LL * [I-F 1 ] -C(I- 1、R [I- 1%])+ MOD)MOD。
        ROF(J、分 <LL>(I、R [I- 1 ])、R [I] + 1)F [I] =([I]〜C(I、J)+ MOD F)%MOD。
    } 
    (I、FOR 1 、N){
        もし(R [i]が< 0ブレーク
        プロ = 1LL *プロ* INV2%のmod。
        ANS =(ANS + 1LL *プロ* F [i])と%MOD。
    } 
    のprintf(" %d個の\ n " 、ANS)。
}
コードの表示

 

おすすめ

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