それは非常に長い時間のように感じています。。
どのような最終的なマスク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型ビット=マスク>> 8&1 。 もし(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 ; } / * * /