jzoj5805

#include<bits/stdc++.h>
using namespace std;
int x,n,pp,ct[10000];
long double f[210][(1<<8)+5][240][2],p,ans;
int main(){
	freopen("exp.in","r",stdin);
	freopen("exp.out","w",stdout);
	scanf("%d%d%d",&x,&n,&pp);
	p=pp/100.0;
	for(int i=1;i<=2000;i++)
		ct[i*2]=ct[i]+1;
	int d=x&1,b=x&255,c=0;
	x>>=8;
	while(x&&(x&1)==d){
		x>>=1;
		c++;
	}
	f[0][b][c][d]=1.0;
	for(int i=0;i<n;i++)
		for(int j=0;j<=255;j++)
			for(int k=0;k<=230;k++)
				for(int l=0;l<=1;l++){
					int b,c,d;
					if(j==255){
						b=0;
						if(l==1){
							d=0;
							c=k;
						}
						else{
							d=1;
							c=1;
						}
					}
					else{
						b=j+1;
						d=l;
						c=k;
					}
					f[i+1][b][c][d]=f[i+1][b][c][d]+f[i][j][k][l]*(1-p);
					//+1
					if(j>127){
						b=(j*2)&255;
						int td=(j*2)&256;
						td>>=8;
						if(td!=l){
							c=1;
							d=td;
						}
						else{
							c=k+1;
							d=l;
						}
					}
					else{
						b=j*2;
						if(l!=0){
							d=0;
							c=1;
						}
						else{
							d=0;
							c=k+1;
						}
					}
					f[i+1][b][c][d]=f[i+1][b][c][d]+f[i][j][k][l]*p;
					//*2
				}
	for(int j=1;j<=255;j++)	
		for(int k=0;k<=230;k++)
			for(int l=0;l<=1;l++)
				ans=ans+f[n][j][k][l]*ct[j];
	for(int k=0;k<=230;k++)
		ans=ans+f[n][0][k][1]*8+f[n][0][k][0]*(8+k);
	printf("%.12Lf\n",ans);
}

我怎麼天天犯傻逼錯誤!

转载于:https://www.cnblogs.com/rilisoft/p/10385251.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值