(纪中)3442. 期望异或【数学?】

119 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


解题思路

这道题的解法还是有点颠覆了我,不符合我正常阅题逻辑。。

讲解》》大新闻


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#define ll long long
#define ldb long double
using namespace std;

ll n,t;
ldb ans,p;

ldb get_mi(ll x){
	ll xx=1;
	while(xx<=x)
		xx<<=1;
	return xx>>1;
}

ldb sum(ll x,ll y){
	return 1.0*(x+y)*(y-x+1)/2;
}

ldb work1(ll x){
	if(x<=1)return 0;
	ll xx=get_mi(x);
	return sum(0,xx-1)*xx+sum(xx,xx+xx-1)*(x-xx)*2+work1(x-xx);
}

ldb work2(ll x,ll y,ll u){
	if(!x||!y)
		return 0;
	if(y==1)return u;
	ll xx=get_mi(y-1);
	if(x>xx)
		return (1.0*u+xx*2-1)*(1.0*y-xx)+work2(x-xx,xx,u+xx);
	else return 1.0*xx*xx+work2(x,xx,u)*2;
	
}

int main(){
	scanf("%lld%Lf",&n,&p);
	ldb ans=(1-p)*work1(n)/n/n+p*work2(n,n,0)/n;
	while(ans/10>=1)
	{
		ans/=10;
		t++;
	}
	while(ans<1&&ans)
	{
		ans*=10;
		t--;
	}
	printf("%.6Lf %lld",ans,t);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值