【luogu 3898】大新闻(数位 DP)

本文探讨了一个涉及异或运算和数位动态规划(DP)的数学问题。具体而言,文章分析了如何在一个给定范围内找到一个数,使得它与随机选择的另一数进行异或操作后,结果的期望值最大化。文章详细介绍了两种情况的解决策略:当目标数未被加密时和被加密时,并提供了具体的代码实现。

文章目录

题意

**记者弄了个大新闻,这个新闻是一个在 [0,n) 内等概率随机选择的整数,记其为 x。为了尽可能消除这个大新闻对公众造成的不良印象,我们需要在 [0,n)内找到某一个整数 y,使得 x ⊕ y 达到最大值。这里 ⊕ 代表异或。

问题在于,**记者有可能对大新闻进行了加密。情报显示,大新闻没有被加密的概率为 p。我们决定采取这样的策略:如果大新闻没有被加密,那么我们选出使得 x ⊕ y 最大的 y;否则,我们在 [0,n) 内等概率随机选择一个整数作为 y。

请求出 x ⊕ y 的期望值。

思路

对于两个问题分开求解。

第一个问题求的是

∑ i = 0 n − 1 ∑ j = 0 n − 1 i    x o r    j \sum_{i=0}^{n-1}\sum_{j=0}^{n-1}i \; xor\; j i=0n1j=0n1ixorj

考虑对于每一位求贡献。某一位的贡献就是该位为 0 的个数和该位为 1 的个数相乘再乘两倍。

第二个问题求的是

∑ i = 0 n − 1 max ⁡ j = 0 n − 1 i    x o r    j \sum_{i=0}^{n-1}\max_{j=0}^{n-1}i \; xor\; j i=0n1j=0maxn1ixorj

可以用数位 DP 求解。对于某一位 k k k,假如 n − 1 n-1 n1 k k k 位是 1 ,那么第 k k k 位是 1 的 i i i 对应的 j j j 在第 k k k 位上就要选 0 ,这个 j j j 就脱离上界限制了,后面的贡献就是 2 k + 1 − 1 2^{k+1}-1 2k+11 。否则的话,一直不能脱离限制,就一直算每一位的贡献。

这道题卡精度,说好的相对误差 1 0 − 5 10^{-5} 105 被搞成了绝对误差。建议口胡过去就算了。

代码

//bzoj 3652
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
const int E = 60;
LL n;
double p, ans1, ans2;

void dfs(int now, LL cnt, bool lim){
	if (now < 0) return;
	if (!lim){
		double pp = double(cnt)/double(n);
		ans2 += pp*((1LL<<now+1)-1);
		return;
	}
	if ((n-1>>now)&1){
		LL cnt0 = (cnt>>now+1<<now)+min(cnt&((1LL<<now+1)-1), (1LL<<now));
		LL cnt1 = cnt-cnt0;
		double pp = double(cnt)/double(n);
		ans2 += pp*(1ll<<now);
		dfs(now-1, cnt0, 1);
		dfs(now-1, cnt1, 0);
	}
	else{
		LL cnt0 = (cnt>>now+1<<now)+min(cnt&((1LL<<now+1)-1), (1LL<<now));
		LL cnt1 = cnt-cnt0;
		double pp = double(cnt1)/double(n);
		ans2 += pp*(1ll<<now);
		dfs(now-1, cnt, 1);
	}
}

signed main()
{
	scanf("%lld%lf", &n, &p);
	ans1 = ans2 = 0;
	for (int i = E; i >= 0; -- i){
		LL cnt0 = (n>>i+1<<i)+min(n&((1LL<<i+1)-1), (1LL<<i));
		LL cnt1 = n-cnt0;
		double pp = double(cnt1)/double(n);
		ans1 += (1.0-pp)*(1LL<<i)*pp;
	}
	ans1 *= 2.0;
	dfs(E, n, 1);
	printf("%.6f\n", ans1*(1.0-p)+ans2*p);
	return 0;
}
标题基于Spring Boot的博客系统设计与实现研究AI更换标题第1章引言介绍基于Spring Boot的博客系统的研究背景、意义、国内外现状及论文创新点。1.1研究背景与意义阐述博客系统在当前网络环境中的重要性及Spring Boot框架的优势。1.2国内外研究现状分析国内外博客系统的发展现状及Spring Boot的应用情况。1.3研究方法以及创新点概述本文采用的研究方法及在博客系统设计中的创新点。第2章相关理论总结Spring Boot框架、博客系统设计原理及相关技术。2.1Spring Boot框架基础介绍Spring Boot的核心特性、依赖管理和自动配置。2.2博客系统设计原理阐述博客系统的基本功能模块、据流和用户交互。2.3相关技术简述据库技术、前端技术及安全技术在博客系统中的应用。第3章博客系统需求分析对博客系统的功能需求、性能需求及用户需求进行详细分析。3.1功能需求分析列举博客系统所需的核心功能,如文章发布、评论管理等。3.2性能需求分析分析博客系统的响应时间、并发处理能力等性能指标。3.3用户需求分析调研不同用户群体对博客系统的期望和需求。第4章博客系统设计详细描述博客系统的架构设计、据库设计及界面设计。4.1系统架构设计给出系统的层次结构、模块划分及模块间交互方式。4.2据库设计设计据库表结构、字段及关系,确保据完整性和一致性。4.3界面设计设计用户友好的界面,包括文章列表、文章详情、评论区等。第5章博客系统实现阐述博客系统的开发环境搭建、功能实现及测试过程。5.1开发环境搭建介绍开发所需的软件、硬件环境及配置步骤。5.2功能实现详细描述各个功能模块的实现过程,包括代码示例。5.3系统测试对博客系统进行功能测试、性能测试及安全测试。第6章结论与展望总结博客系统的设计与实现成果,提出未来改进方向。6.1研究结论概括博客系统的主要功能、性能
最新扫码点餐外卖配送餐饮小程序系统源码 系统功能: 1.支持多平台:微信小程序,支付宝小程序,和H5平台,页面可以后台DIY管理。 2.小程序页面支持后台DIY,后台修改后即可同步到发布的小程序页面。 3.点单模式:支持堂食,外卖,打包自取。 4.下单:支持多人同时,中途加菜,退单等。 5.订单提醒:支持小程序订阅消息,公众号模板消息,小票打印。 6.结算方式:微信,支付宝,余额,餐后线下等。 7.商品管理:单,多规格,起售量,打包费,库存销量推荐等操作。 8.门店管理:餐桌,店员,口味,云设备,二维码,wifi,预约订桌等管理。 9.会员卡:付费开会员,积分等级,等级折扣,升级赠送,卡面定制等。 10.积分签到:签到赠送积分或余额,添加签到任务等。 11.会员充值:前后台充值操作,充值套餐,充值送余额,充值送优惠券等。 12.优惠券:现金券(满减),折扣券(满折),赠送券(满赠)等 13.财务统计:实时统计,七日趋势,日统计,月统计,指定时间段统计,报表下载,打印等。 14.小票打印:易联云,飞鹅,趋等品牌打印机。(其它可扩展) 15.第三方配送:河马跑腿,闪送,UU跑腿,顺丰同城,达达配送,码科配送(其它可扩展) 16.小票打印:易联云,飞鹅,趋。(其它可扩展) 17.云存储:腾云,阿里,七牛(其它可扩展) 18.短信:腾云,阿里,七牛(其它可扩展) 仅供研究学习使用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值