Codeforces 441Eバレラと数DP

バレラと番号

それは非常に長い時間のように感じています。。 

どのような最終的なマスク9有りを表すDP [O] [I] [マスク]。

現在の確率はこの状態をlowbitマスク== 0、Oラウンドの表現、もし。

マスクは!= 0、Oは、最終的なマスク9ラウンド行っ表す場合、この状態で10 1の連続した先頭の数の確率から、です。

 

DPから[O] [I] [0] + 1このような動作後、私は、これらの連続する1は、廃棄することができる場合、このすべては、また+1を追加していないにも後ろに、何の用途を有していません。

#include <ビット/ STDC ++。H>
 の#defineは LL長い長
 の#define LD長い二
 の#define ULL符号なし長い長
 の#define第Fiの
 に#define SE第二
 の#define MK make_pair
 の#define PLL対<LL、LL>
 の#define PLI対<LL、整数>
 の#define PII対<整数、整数>
 の#define SZ(X)((INT)x.size())
 の#define ALL(X)(X).begin()、(X).END( )
 の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、CONSTのINT N = 250 + 7 

 

 const  int型 INF = 0x3f3f3f3f constの LL INF = 0x3f3f3f3f3f3f3f3f const  int型 MOD = 1E9 + 7 constの ダブル EPS = 1E- 10 ;
CONST  ダブル PI = ACOS( - 1 )。

テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} 
テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(< 0)、A + = MOD;} 
テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、;} 
テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?= B、;} 

MT19937 RNG(。。クロノ:: steady_clock ::今()time_since_epoch())(カウント)。

INT X、K、P。
二重 DP [ 2 ] [ 250 ] [1 << 9 ]。
ダブルP1、P2; 

二重(* F)1 << 9 ] DPを= [ 0 ]。
二重(*、G)1 << 9 ] = DP [ 1 ]。

インラインINT getLow(INT マスク){
     ためint型 i = 0 ; iは++)場合(マスク>> I&1リターンI。
} 

int型のmain(){ 
    scanf関数(" %D%D%D "、およびX、&K&P)。
    P1= 1.0 * pを/ 100 ; 
    P2 = 1 - P1。

    INT C = 0、マスク=(X&511 )。

    もし(マスク){
         ためint型 I = 9 ; I ++ ){
             場合(X >> I&1)C ++ 他に 休憩; 
        } 
    } そうでなければ{ 
        C = getLow(X)。
    } 

    [C] [マスク] F = 1 

    以下のためのint型 O = 0 ; O <K。O ++ ){ 
        スワップ(F、G)。
        以下のためにint型 i = 0 ; iは= < 240 ; iは++ のためにint型マスク= 0 ;マスク<(1 << 9)マスク++ 
                [I] [マスク] F = 0 以下のためにint型 i = 0 ; iが< 240 I ++; ){
             ためのint型マスク= 0 ;マスク<(1 <<9)。++マスク){
                 場合(マスク){
                     // +1 
                    場合(+マスク1 ==を(1 << 9 )){ 
                        F [I + 9 ] [ 0 ] + = G [i]は[マスク] * P2。
                    } { 
                        [I] [マスクF + 1 ] + = G [i]は[マスク] * P2。
                    } 

                    // * 2 

                    INT nmask =(マスク<< 1)&511 int型ビット=マスク>> 81 

                    もし(nmask){
                         場合(ビット){ 
                            F [I + 1 ] [nmask] + = G [i]は[マスク] * P1。
                        } { 
                            [F 0 ] [nmask] + = G [i]は[マスク] * P1。
                        } 
                    } { 
                        [F 9 ] [ 0 ] + = G [i]は[マスク] * P1。
                    } 

                } {
                    // +1 
                    F [ 0 ] [ 1 ] + = G [i]は[マスク] * P2。
                    // * 2 
                    F [I + 1 ] [ 0 ] + = G [i]は[マスク] * P1。
                } 
            } 
        } 
    } 

    二重のANS = 0 

    以下のためにint型 i = 0 ; iは= < 240 ; iは++ ){
         ためint型マスク= 0 ;マスク<(1 << 9)マスク++){
             場合(マスク){ 
                ANS + = getLow(マスク)* [I] F [マスク]。
            } { 
                ANS + = i *がF [i]が[マスク]。
            } 
        } 
    } 

    のprintf(" %.12fする\ n " 、ANS)。
    リターン 0 ; 
} 

/ * 
* /

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/11114448.html