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

本文共 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

你可能感兴趣的文章
SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)...
查看>>
curry&unCurry函数
查看>>
JVM调优
查看>>
防止ViewPager和Fragment结合使用时候的数据预加载
查看>>
c# Webservice技术整理
查看>>
js正则表达式匹配斜杠 网址 url等
查看>>
day-02(css,js)
查看>>
Centos6 安装chrome
查看>>
使用EXtjs6.2构建web项目
查看>>
Window Live Writer在Win7下安装提示错误“OnCatalogResult:0x80190194”
查看>>
2018.12.7边界圆角redius,背景图设置,平铺,精灵图,盒子伪类索引
查看>>
hdwiki 数据库结构说明
查看>>
求链表的中间节点
查看>>
北京市工资交税情况
查看>>
事务范围数据库读写分离失败
查看>>
webstorm html碎片整理功能
查看>>
腾讯云Badjs镜像使用入门
查看>>
sqoop-1.4.6安装配置
查看>>
二叉树的构建和层级打印
查看>>
C++基础回顾-字符串地址比较
查看>>