Acwing 216. Rainbow的信号

题意:

给你n个数,在这n个数中,等概率地选取两个数l,r,如果l>r,则交换l,r
把信号中的第 l 个数到第 r 个数取出来,构成一个数列 P。

A 部分对话的密码是数列 P 的 xor 和的数学期望值,xor 和就是数列 P 中各个数异或之后得到的数; xor 和的期望就是对于所有可能选取的 l、r,所得到的数列的 xor 和的平均数。

B 部分对话的密码是数列 P 的 and 和的期望,定义类似于 xor 和。

C 部分对话的密码是数列 P 的 or 和的期望,定义类似于 xor 和。

题解:

参考题解
按位来计算答案。枚举二进制下的每一位,因为数<109,说明最多30位
对于每一位(这里指的是二进制数位),枚举1到n每个数,把当前枚举的第k个数当作是范围的右端点,考虑左端点的取值情况来计算概率
设当前枚举的数位是k,当前枚举的是第r个数,当前第r个数的数位的值为v(v只会是0或1)
注意:题目说了当l>r时会交换l和r,所以l和r的取值范围均为n,所以l = r的概率为1/n ^ 2,其他概率为2/n ^ 2.
xor 和的期望就是对于所有可能选取的 l、r,所得到的数列的 xor 和的平均数。也就是所能取到的值乘以取到的概率
当数位的值v为1时
因为有l = r的情况,所有xor,and,or的答案都要加上该数位的值乘以1/n ^2(如果这是第3位,那就要加上4/n ^2),我们设pos=(该数为的值)/n ^2 = (1<<k)/n ^2

对于or,or是有1则1,而当前v正是1(也就是第r位是1),所以左端点l随便取(当前不能等于r),所以l的取值概率为(r-1) * pos * 2(别忘乘以2)
对于and,and是全部为1则1,所以我们需要用last[v]表示上一次v出现的位置,last[0]表示上一次0出现的位置,而l的取值范围是[last[0]+1,r-1],所以概率为(r-1-last[0])* pos * 2

当前数位的值v为0的时候:
and怎么都是0,所以不用考虑
对于or,l的所取的区间中的数位必须出现一个1,last[1]表示上一次1出现的位置,那l区间范围是[1,last[1]],所以概率就是last[1] * pos * 2

xor单独讨论
对于1到n各个数在第k位上的数位值:

我们现在以1为边界将区间分段:

每一段内有且只有一个1(r所在的那一段暂不考虑),异或0对xor没有影响,而每异或一次1,xor的值就会发生反转,所以我们用c1表示奇数区间包含的值的个数,c2表示偶数区间包含的值的个数
如果r为1,那么l位于偶数区间的话,答案异或为1,也就是l有c1个取值可能。如果r为0,那么l就有c2个取值可能(代码中实现c1和c2的方法很妙)
详细可以看代码diamond

代码:

#include<bits/stdc++.h>
using namespace std;int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}const int maxn=1e5+5;
int n,c1,c2;
int w[maxn],p[maxn],last[2];
double ansxor,ansand,ansor;void solve(int k)
{c1=c2=0;last[0]=last[1]=0;double pos=(double)(1<<k)/n/n;//当前数位的实际值/n方的概率for(int r=1;r<=n;r++){int v=((w[r]>>k)&1);if(v){ansxor+=pos;ansand+=pos;ansor+=pos;}if(v){ansor+=pos*(r-1)*2;ansand+=pos*(r-1-last[0])*2;ansxor+=pos*c1*2;}else {ansor+=pos*last[1]*2;ansxor+=pos*c2*2;}++c1;if(v) swap(c1,c2); //到了新的区间,就开始另一个变量开始计数 last[v]=r;}
}int main()
{n=read();for(int i=1;i<=n;i++) w[i]=read();for(int i=0;i<=30;i++) solve(i);printf("%.3lf %.3lf %.3lf",ansxor,ansand,ansor);return 0;
}

Acwing 216. Rainbow的信号相关推荐

  1. bzoj3054 Rainbow的信号(位运算+瞎搞)

    考虑单独统计每一位对答案的贡献. 考虑枚举区间右端点i,那么&操作就是往左找第一个0的位置 |操作就是往左找第一个1的位置 ^操作就是记一下到i-1的异或和为0/1的个数,转移一下就好了 复杂 ...

  2. [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)

    传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...

  3. Viterbi 算法无线通信信号处理Demo

    问题描述 信道H长度L=3,H = (h0,h1,h2),其中h0=,h1=,h2=; 基本信号类型 x =10或-10,一个完整的信号序列为X = (x0,x1,x2,...,x9);噪声W = ( ...

  4. SRE Google运维解密pdf

    下载地址:网盘下载 自动化对Google SRE 的价值 62 自动化的应用案例 63 Google SRE 的自动化使用案例 63 自动化分类的层次结构 64 让自己脱离工作:自动化所有的东西 66 ...

  5. 本科时写的一篇《关于ISAR图像的自动目标提取技术》

    ISAR图像中目标选取算法的研究 院 (系):  电子与信息工程学院  专    业:信息对抗技术 学 号:           指导教师:  2015年7月       毕业设计(论文) 题     ...

  6. 基于FPGA的工业相机项目大赏1——cmos线阵相机

    摘要 本文关于基于fpga的cmos工业相机项目工程概览与总结,涉及以下内容: 1.模块总结:整体设计方案.子模块划分.关键技术点/信号 2.调试:关键模块.信号的仿真.调试总结 3.硬件布局:引脚配 ...

  7. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

  8. [noip模拟赛2017.7.7]

    转自同组的一个OIer(当然是比我强的) 题目名称 小猫爬山 Freda 的传呼机 Rainbow 的信号 程序文件名 catclimb communicate signal 输入文件名 catcli ...

  9. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

最新文章

  1. Installing Oracle Database 18c Using RPM Packages
  2. DTO(领域数据传输对象)是做什么的
  3. 使用简单的5个步骤设置 Web服务器集群
  4. 真是虚惊一场的i_like_cpp
  5. 手机html滚动原理,手机滚动-如何实现惯性滚动
  6. Linux中sql*loader-350,SqlLoader
  7. 多智能体深度强化学习值分解方法总结(1)——VDN/QMIX/QTRAN/Qatten
  8. 如何Word中修改Normal样式模板
  9. 将数据与OpenLayers结合在一起
  10. 淘宝天猫购物优惠券系统开发,java后端(ssm)+Android 原生APP,对接淘宝开放平台
  11. 如何注册知乎小号,利用知乎一天引流超高转化精准粉
  12. Scala中的基本类型 与操作符
  13. 如何做网络投票的刷票外挂(一)
  14. 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
  15. 约翰霍普金斯大学计算机博士收入,约翰霍普金斯大学计算机科学研究生项目详情!...
  16. Oracle创建数据库连接——DATABASE LINKS
  17. http的长连接和短连接(史上最通俗!)以及应用场景
  18. 什么是DCS系统?DCS和SCADA的区别
  19. 求生之路:学术生涯的17条简单生存法则
  20. 汽车保养知识知多少?这篇文章让你秒懂

热门文章

  1. 让TA们告诉你,疫情当下如何更彪悍的成长
  2. 历史上最怪异的23种飞行器,设计者脑子里都想什么了
  3. 快速掌握MATLAB应用,从这一步开始
  4. 爱思助手短信备份到安卓_爱思助手肿么将短信导入iphone
  5. linux下安装服务,linux下的软件服务安装管理
  6. java得到文件创建时间linux,linux java获取文件创建时间
  7. linux命令查询邮件发送状态,Linux发邮件之mail命令详解
  8. linux 连接wifi wpa2,RHEL等Linux系统使用wpa_supplicant以WPA-PSK/WPA2-PSK连接WIFI
  9. java超长字符序列化_String 字符串最长可以有多长?
  10. java先进先出 循环队列,JavaScript队列、优先队列与循环队列