BZOJ4036:按位或 (min_max容斥&高维前缀和)
Description
Input
第一行输入n表示n个元素,第二行输入2^n个数,第i个数表示选到i-1的概率
Output
仅输出一个数表示答案,绝对误差或相对误差不超过1e-6即可算通过。如果无解则要输出INF
Sample Input
0.250.250.250.25
Sample Output
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容斥&高维前缀和)的更多相关文章
- [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)
[luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...
- luoguP3175 [HAOI2015]按位或 min-max容斥 + 高维前缀和
考虑min-max容斥 \(E[max(S)] = \sum \limits_{T \subset S} min(T)\) \(min(T)\)是可以被表示出来 即所有与\(T\)有交集的数的概率的和 ...
- Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)
题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...
- [Hdu-6053] TrickGCD[容斥,前缀和]
Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...
- 从 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 \] 证明 ...
- Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望
传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...
- bzoj 4036 按位或 —— min-max容斥+FMT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 min-max容斥:https://blog.csdn.net/ez_2016gdgz ...
- kth min_max容斥
题解: 普通的$min-max$容斥是用来求最后出现元素的期望之类的 $kth min-max$容斥进一步解决倒数第k个出现的元素的期望 给出公式: $kthmax(S)=\sum\limits_{T ...
- bzoj 4036 [HAOI2015]按位或——min-max容斥+FMT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 题解:https://www.cnblogs.com/Zinn/p/10260126. ...
随机推荐
- jQuery基本筛选选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- valgrind的memchk和callgrind
一.安装valgrind 安装valgrind,正常的三部曲configure/make/make install就行. 二.memchk使用 1.执行命令 [root@10g-host4 tools ...
- windows系统下简单node.js环境配置 安装
国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网 htt ...
- DataReader 连接数据库完整过程和代码(Sql Server)
数据库名叫:Bu 有个表:A 里面有一列:ID 需要引用 using System.Data.SqlClient; 代码部分如下: SqlConnection sqlCon=new SqlConnec ...
- Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'
Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String' 一.发现问题 <select ...
- SQL Server----解决SQL Server 配置管理器不见了
错误重现: 之前安装好的SQL Server 2012打开都没有问题,好多天没有打开了,今天打开我的SQL Server 2012 连接时出现错误: 在与SQL Server 建立连接时出现与网络相关 ...
- java开发设计六大基本原则
1.遵循单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责.一个类只专注于做一件事: 高内聚,低耦合: 实例: 普通的手表如果有一个指针坏了,那么手表将不再转动,而 ...
- node.js 之 http 架设
Node.js 安装配置 下载node.js安装mis 打开:cmd cd到node.js安装目录下 输入nodejs --version 显示版本号,证明安装成功 在其根目录下建server.js ...
- C++名字查找和重载
重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数.这里有一个重要的前提就是:同一个作用域: 而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编 ...
- Python中 如何使用telnet 检测端口是否通
import tn=telnetlib.Telnet(host,port)不报异常则该端口是通的,可结合try进行使用