题目描述

从前有个变量$x$,它的初始值已给出。
你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$。
假设最后得到的值为$w$,令$d$为$w$的质因数分解中$2$的次数,求$d$的期望。


输入格式

从文件$exp.in$中读入数据。
第一行三个整数$x,n,p$,含义见题目描述。


输出格式

输出到文件$exp.out$中。
一行一个实数,表示$d$的期望。
如果你的答案与标准答案的误差不超过$10^{−6}$,则判定为正确。


样例

样例输入1:

1 1 50

样例输出1:

1.0000000000

样例输入2:

5 3 0

样例输出2:

3.0000000000

样例输入3:

5 3 25

样例输出3:

1.9218750000


数据范围与提示

对于$20\%$的数据,$n\leqslant 20$;
对于$30\%$的数据,$n\leqslant 50$;
对于$50\%$的数据,$n\leqslant 100$;
对于$100\%$的数据,$x\leqslant 10^9,n\leqslant 200,0\leqslant p\leqslant 100$。


题解

首先,质因数分解中$2$的个数即为二进制表示下末尾$0$的个数。

考虑$DP$,设$dp[i][s][j][0/1]$表示进行第$i$次操作后,当前数的二进制表示后$8$位为$s$,第九位为$0/1$,从第九位开始往前连续$j$位相同的概率。

先来解释后$8$位的原因,因为至少要$2^8+1$次操作才可以向$9$进位,而操作数只有$200$,所以不会对答案造成贡献。

再来解释$j$的用途,假如后$8$位都是$1$第九位也是$1$,那么我们在进行$+1$的操作后会变成$1000……$,而$j$是为了计算出这个$1$的位置。

转移一共有$8$个,不再一一赘述,具体可以看代码。

时间复杂度:$\Theta(2^8n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int X,N,P,mx;
double gl1,gl2;
double dp[201][257][300][2];
double ans;
void pre_work()
{
int flag=X>>8,sum=0;
for(int i=flag&1;(flag&1)==i&&flag;sum++)flag>>=1;
if(!sum)sum++;mx=N+sum;
dp[0][X&255][sum][(X>>8)&1]=1;
}
int judge(int x)
{
int res=0;
while(!(x&1)){res++;x>>=1;}
return res;
}
int main()
{
scanf("%d%d%d",&X,&N,&P);
gl1=(double)P/100;
gl2=(double)(100-P)/100;
pre_work();
for(int i=0;i<N;i++)
for(int s=0;s<256;s++)
for(int j=1;j<=mx;j++)
{
if(!(((s<<1)&256)>>8))dp[i+1][(s<<1)&255][j+1][0]=dp[i+1][(s<<1)&255][j+1][0]+dp[i][s][j][0]*gl1;
else dp[i+1][(s<<1)&255][1][1]=dp[i+1][(s<<1)&255][1][1]+dp[i][s][j][0]*gl1;
if(((s<<1)&256)>>8)dp[i+1][(s<<1)&255][j+1][1]=dp[i+1][(s<<1)&255][j+1][1]+dp[i][s][j][1]*gl1;
else dp[i+1][(s<<1)&255][1][0]=dp[i+1][(s<<1)&255][1][0]+dp[i][s][j][1]*gl1;
if(s==255)dp[i+1][0][1][1]=dp[i+1][0][1][1]+dp[i][255][j][0]*gl2;
else dp[i+1][s+1][j][0]=dp[i+1][s+1][j][0]+dp[i][s][j][0]*gl2;
if(s==255)dp[i+1][0][j][0]=dp[i+1][0][j][0]+dp[i][255][j][1]*gl2;
else dp[i+1][s+1][j][1]=dp[i+1][s+1][j][1]+dp[i][s][j][1]*gl2;
}
for(int s=1;s<256;s++)
for(int j=1;j<=mx;j++)
ans+=(dp[N][s][j][0]+dp[N][s][j][1])*judge(s);
for(int j=1;j<=mx;j++)ans+=dp[N][0][j][0]*(j+8)+dp[N][0][j][1]*8;
printf("%.6lf",ans);
return 0;
}

rp++

[CSP-S模拟测试]:简单的期望(DP)的更多相关文章

  1. [CSP-S模拟测试]:B(期望DP)

    题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...

  2. [CSP-S模拟测试]:chemistry(期望DP+组合数学)

    题目传送门(内部题27) 输入格式 第一行有$4$个整数$n,k,p,q$.第二行有$n$个整数$a_i$.接下来有$n-1$行,每行有两个整数$u,v$,表示$u$与$v$之间通过化学单键连接. 输 ...

  3. [CSP-S模拟测试]:走路(期望DP+分治消元)

    题目传送门(内部题100) 输入格式 第一行两个整数$n,m$,接下来$m$行每行两个整数$u,v$表示一条$u$连向$v$的边.不保证没有重边和自环. 输出格式 $n-1$行每行一个整数,第$i$行 ...

  4. [CSP-S模拟测试]:简单的序列(DP)

    题目描述 从前有个括号序列$s$,满足$|s|=m$.你需要统计括号序列对$(p,q)$的数量. 其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列. 输入格式 ...

  5. [CSP-S模拟测试]:树(树形DP+期望)

    题目描述 梦游中的你来到了一棵$N$个节点的树上.你一共做了$Q$个梦,每个梦需要你从点$u$走到点$v$之后才能苏醒,由于你正在梦游,所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  6. [CSP-S模拟测试]:优化(贪心+DP)

    题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...

  7. [CSP-S模拟测试]:w(树上DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...

  8. [CSP-S模拟测试]:密码(数位DP+库默尔定理)

    题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...

  9. [CSP-S模拟测试]:硬币(博弈论+DP+拓展域并查集)

    题目传送门(内部题135) 输入格式 第一行包含一个整数$T$,表示数据组数. 对于每组数据,第一行两个整数$h,w$,表示棋盘大小. 接下来$h$行,每行一个长度为$w$的字符串,每个位置由为$o, ...

随机推荐

  1. 更新代码 出现 You need to upgrade the working copy first 错误

    今天更新了Eclipse的subclipse插件,更新代码报如下错误: svn: The working copy at 'E:\591woospace\kst_fashion_alipay_v1.2 ...

  2. Vim文本编辑工具

    4文本编辑工具Vim Vim是vi的升级版,编辑文本时vi不会显示颜色而vim会显示颜色. 安装vim工具 #yum  install  –y  vim-enhanced Vim有三种模式:一般模式. ...

  3. 学习总结&实验报告1

    Java实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class Project ...

  4. 第二周JAVA总结

    学海无涯,在学习这件事情上得用点心了

  5. ubuntu 虚拟机安装

    ubuntu16.04.5 LTS 安装   1.下载ubuntu镜像 打开ubuntu官网镜像地址https://launchpad.net/ubuntu/+cdmirrors 在上面中搜索chin ...

  6. C#读取 *.exe.config

    读语句: String str = ConfigurationManager.AppSettings["DemoKey"];写语句: Configuration cfa = Con ...

  7. OracleOraDb11g_home1TNSListener服务无法启动

    作者:伪墨 来源:CSDN 原文:https://blog.csdn.net/qq997404392/article/details/73296429 今天遇到OracleOraDb11g_home1 ...

  8. CentOS7 硬盘检测

    一.测试硬盘健康状态 安装相关工具:yum -y install smartmontools SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及每一块硬盘(包括IDE.SCSI),在 ...

  9. HNCPC2019H 有向图

    题目 设\(f_i\)表示经过\(i\)的期望次数.那么显然答案\(ans_j=\sum\limits_{i=1}^nf_iP_{i,j}\). 我们可以轻松地列出转移式子: \[ f_1=\sum\ ...

  10. Period II

    For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the ...