Description

刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal
的or)操作。选择数字i的概率是p[i]。保证0<=p[i]<=1,Σp[i]=1问期望多少秒后,你手上的数字变成2^n-1。

Input

第一行输入n表示n个元素,第二行输入2^n个数,第i个数表示选到i-1的概率

Output

仅输出一个数表示答案,绝对误差或相对误差不超过1e-6即可算通过。如果无解则要输出INF

Sample Input

2
0.250.250.250.25

Sample Output

2.6666666667

HINT

对于100%的数据,n<=20

思路:可以min_max容斥来做,问题的关键就是求出得到所有子集X的期望F(X)就可以了,P(X)的概率为所有对X有贡献的p[x]之和(x是所有和X有交集的x,即便x含有X没有的部分);

我们倒过来求与X交集为空的部分的概率,即M^X的子集的概率,这部分可以用高维前缀和来做。

    for(int i=;i<N;i++)
for(int j=;j<(<<N);j++)
if(j&(<<i)) F[j]+=F[j^(<<i)];
这个代码可以得到子集的前缀和。 复杂度是O(N*^N)

超集的写法:

    for(int i=;i<N;i++)
for(int j=;j<(<<N);j++)
if(!j&(<<i)) F[j]+=F[j|(<<i)];
#include<bits/stdc++.h>
using namespace std;
const int maxn=<<;
double P[maxn],ans;int N,sum,M;
void dfs(int pos,int now,int cnt)
{
if(pos==N){
if(cnt>=){
if(cnt&) ans+=1.0/(1.0-P[(M-)^now]);
else ans-=1.0/(1.0-P[(M-)^now]);
}
return ;
}
dfs(pos+,now|(<<pos),cnt+);
dfs(pos+,now,cnt);
}
int main()
{
scanf("%d",&N); M=<<N;
for(int i=;i<M;i++){
scanf("%lf",&P[i]);
if(P[i]>) sum|=i;
}
if(sum!=M-) return puts("INF"),;
for(int i=;i<N;i++)
for(int j=;j<M;j++)
if(j&(<<i)) P[j]+=P[j^(<<i)];
dfs(,,);
printf("%.6lf\n",ans);
return ;
}
//2 0.25 0.25 0.25 0.25

当然,为1的个数我们也可以预处理出来。就不用DFS了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=<<;
double P[maxn],ans;int N,sum,M,num[maxn];
int main()
{
scanf("%d",&N); M=<<N;
for(int i=;i<M;i++){
scanf("%lf",&P[i]);
if(P[i]>) sum|=i;
}
if(sum!=M-) return puts("INF"),;
for(int i=;i<M;i++) num[i]=num[i>>]+(i&);
for(int i=;i<N;i++)
for(int j=;j<M;j++)
if(j&(<<i)) P[j]+=P[j^(<<i)];
for(int i=;i<M;i++)
ans+=(num[i]&?1.0:-1.0)/(-P[(M-)^i]);
printf("%.6lf\n",ans);
return ;
}
//2 0.25 0.25 0.25 0.25

BZOJ4036:按位或 (min_max容斥&高维前缀和)的更多相关文章

  1. [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)

    [luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...

  2. luoguP3175 [HAOI2015]按位或 min-max容斥 + 高维前缀和

    考虑min-max容斥 \(E[max(S)] = \sum \limits_{T \subset S} min(T)\) \(min(T)\)是可以被表示出来 即所有与\(T\)有交集的数的概率的和 ...

  3. Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)

    题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...

  4. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

  5. 从 0 开始的min_max容斥证明

    二项式反演 \[f_n=\sum\limits_{i=0}^nC^i_ng_i \Leftrightarrow g_n=\sum\limits_{i=0}^n{(-1)}^{n-i}f_i \] 证明 ...

  6. Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望

    传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...

  7. bzoj 4036 按位或 —— min-max容斥+FMT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 min-max容斥:https://blog.csdn.net/ez_2016gdgz ...

  8. kth min_max容斥

    题解: 普通的$min-max$容斥是用来求最后出现元素的期望之类的 $kth min-max$容斥进一步解决倒数第k个出现的元素的期望 给出公式: $kthmax(S)=\sum\limits_{T ...

  9. bzoj 4036 [HAOI2015]按位或——min-max容斥+FMT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 题解:https://www.cnblogs.com/Zinn/p/10260126. ...

随机推荐

  1. linux 进程在后台执行

    把任务放到后台用 & 和 Ctrl+z 让后台任务从停止状态转为运行状态用 bg %N 把后台任务调回到前台用 fg %N 查看所有任务用jobs https://www.cnblogs.co ...

  2. codeforces246E Blood Cousins Return

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. 读懂 ECMAScript 规格

    概述 规格文件是计算机语言的官方标准,详细描述语法规则和实现方法. 一般来说,没有必要阅读规格,除非你要写编译器.因为规格写得非常抽象和精炼,又缺乏实例,不容易理解,而且对于解决实际的应用问题,帮助不 ...

  4. python爬虫之下载京东页面图片

    import requests from bs4 import BeautifulSoup import time import re t = 0 #用于给图片命名 for i in range(10 ...

  5. 新东方雅思词汇---9.1、sist

    新东方雅思词汇---9.1.sist 一.总结 一句话总结: 站 resist 英 [rɪ'zɪst]  美 [rɪ'zɪst]  vi. 抵抗,抗拒:忍耐 vt. 抵抗:忍耐,忍住 n. [助剂] ...

  6. Java 注解(Annotation)秒懂,你可以这样学,

    文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的.至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明.好了,可以开始今天的博文了. Anno ...

  7. 《深入理解mybatis原理3》 Mybatis数据源与连接池

    <深入理解mybatis原理> Mybatis数据源与连接池 对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构 ...

  8. http协议code码

    301 永久重定向 类似手机呼叫转移 302 临时重定向 类似手机呼叫转移 403 forbidden ngnix怎么解决? 含义:表示你在请求一个资源文件,但是nginx不允许你查看. 原因1:访问 ...

  9. Linux IPv6 地址配置

    添加IPV6地址ip -6 addr add <ipv6address>/<prefixlength> dev <interface>ip -6 addr add ...

  10. 【Error】SSL InsecurePlatform error when using Requests package

    使用requests时会出席SSL InsecurePlatform error when using Requests package的错误,一般情况下python2.7.10以下的环境会出现此错误 ...