博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj 4036][HAOI2015]按位或
阅读量:6913 次
发布时间:2019-06-27

本文共 949 字,大约阅读时间需要 3 分钟。

Description

刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or)操作。

选择数字i的概率是p[i]。保证0<=p[i]<=1,Σp[i]=1问期望多少秒后,你手上的数字变成2^n-1。

Solution

相当于给你一个集合求最后一个元素出现的时间

可以用\(minmax\) 容斥一波,这样就是求每个子集中第一个元素出现的时间\(min(T)\)

我们设\(P(T)\)表示取到\(T\)的子集的概率

\[ P(min(T)==k)=P(S-T)^{k-1}(1-P(S-T)) \]
然后因为:
\[ 若P(x==k)=(1-p)^{k-1}p(k \in N^{+}),则E(x)=\frac{1}{p} \]
所以:
\[ E(min(T))=\frac{1}{1-P(S-T)} \]
问题在于,如何求\(P(T)\)

显然

\[ P(T)=\sum_{x⊆T}p(x),这里我们把一个数都当作一个集合,p(x)就是题目给出的得到x的概率 \]
求子集和?可以用像 一样的子集和dp,当然,也可以直接\(FWT\)变换一下。

Code 

#include
#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))int n,N,num[1<<20];double P[1<<20],Ans=0.;int main(){ scanf("%d",&n);N=1<
>1]+(i&1); if(1-P[(N-1)^i]<1e-9) return 0*puts("INF"); Ans+=((num[i]&1)?1.:-1.)*(1./(1.-P[(N-1)^i])); } printf("%.9lf\n",Ans); return 0;}


Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10282420.html

你可能感兴趣的文章
TNS-12535 TNS-00505的处理方法
查看>>
R语言:数据输出至文件
查看>>
Linux下搭建 NFS
查看>>
VR AR创新创业大赛顺利收官,行业大咖看好移动VR发展
查看>>
Vive戴起来不够舒服?SynergyWiz为其设计了翻盖
查看>>
新年快乐,介绍个简单的Excel理财工作的制作方法
查看>>
[翻译-ASP.NET MVC]Contact Manager开发之旅之迭代1 - 创建Contact Manager应用
查看>>
Linux C 下使用openssl 进行SHA1加密
查看>>
4星|《我的第一本创业融资指南》:投资人写的创业者融资指南
查看>>
再现一分钱中标,中国电信拿下海南政务云项目
查看>>
文件服务器之二:FTP服务器(pureftp)
查看>>
30分钟快速搭建门店智能监控视频分析
查看>>
解决drbd不能启动问题(Can not load the drbd module.)
查看>>
简单的RIP实验
查看>>
4星|《哈佛商业评论》2017年11期:高质量基础管理对企业的重要性不亚于卓越的战略思考。...
查看>>
ssh端口转发(之kettle ssh方式连接数据库)
查看>>
出现错误,显示事务没有回滚
查看>>
2、权限、变量、for 学习笔记
查看>>
Centos6安装配置rsync+inotify实时单向同步
查看>>
Cisco系列路由器密码恢复研究与实践
查看>>