4036: [HAOI2015]按位或

Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 746  Solved: 456
[Submit][Status][Discuss]

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.25 0.25 0.25 0.25

Sample Output

2.6666666667

HINT

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

题解

首先无解非常好判. 非 $0$ 概率值全都或起来如果得不到全集就肯定无解了.

这题要求期望...考虑期望等于啥...

每步开始之前, 我们对于非全集的情况都需要继续进行下一步.

由期望的线性性, 我们可以对于每一步都分开计算.

而进行完一步之后每种状态的概率要怎么算呢? 显然我们有:

$$ c_k=\sum_{i\operatorname{or}j=k} a_it_j$$

显然这是一个或运算卷积的形式. 所以对于一步的情况, 我们可以FWT解决.

但是在这个题目里则可能是无限步, 我们继续来思考.

因为FWT满足卷积定理, 所以我们有:

$$ \operatorname{FWT}\left(\sum_{i=0}^\infty t^i\right)_k=\sum_{i=0}^\infty \operatorname{FWT}(t)_k^i $$

而等式右边是个首项为 $1$ 的等比数列求和式, 因为 $\operatorname{FWT}(t)_k\leq 1$ 所以这个值一定收敛于 $\frac 1 {1-\operatorname{FWT}(t)_k}$.

算完 $\operatorname{FWT}^{-1}$ 回去求所有非全集下标的和就行了.

代码实现

毕姥爷: 从我们都熟悉的FWT开始

 #include <bits/stdc++.h>

 const int DWT=;
const int IDWT=-;
const int MAXN=(<<)+; double a[MAXN]; void FWT(double*,int,int); int main(){
int n;
scanf("%d",&n);
int len=<<n;
int cur=;
for(int i=;i<len;i++){
scanf("%lf",a+i);
if(a[i]>)
cur|=i;
}
if(cur!=len-)
puts("INF");
else{
FWT(a,len,DWT);
for(int i=;i<len;i++)
a[i]=1.0/(-a[i]);
FWT(a,len,IDWT);
double ans=;
for(int i=;i<len-;i++)
ans+=a[i];
printf("%.10f\n",ans);
}
return ;
} void FWT(double* a,int len,int opt){
for(int i=;i<len;i<<=)
for(int j=;j<len;j+=i<<)
for(int k=;k<i;k++)
a[j+k+i]+=opt*a[j+k];
}

BZOJ 4036

[BZOJ 4036][HAOI2015]按位或的更多相关文章

  1. BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演

    http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/5 ...

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

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

  3. bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】

    其实也不是FWT--我也不知道刷FWT专题问什么会刷出来这个东西 这是min-max容斥讲解:https://www.zybuluo.com/ysner/note/1248287 总之就是设min(s ...

  4. BZOJ 4036 [HAOI2015] Set 解题报告

    首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...

  5. 【BZOJ4036】[HAOI2015]按位或 FWT

    [BZOJ4036][HAOI2015]按位或 Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or ...

  6. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

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

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

  8. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

  9. bzoj4036 / P3175 [HAOI2015]按位或

    bzoj4036 / P3175 [HAOI2015]按位或 是一个 min-max容斥 的板子题. min-max容斥 式子: $ \displaystyle max(S) = \sum_{T\su ...

随机推荐

  1. ThreadPoolExecutor 杂记

    When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are ru ...

  2. 使用Microsoft Azure云平台中的Service Bus 中继 Intanet环境下的WCF服务。

    之前写的一篇文章:) 看起来好亲切. http://www.cnblogs.com/developersupport/archive/2013/05/23/WCF-ON-IIS-Azure-Servi ...

  3. 在css当中使用opacity

    background:rgba(0,0,0,0.5);会使背景变透明:opacity会让内容也变透明

  4. Service , DAO ,DBUTtil;

    Service , DAO ,DBUTtil; util一般为基本的数据库操作:打开,关闭数据库连接,查询和更新操作. service 调用 dao 实现业务操作 dao层设计要为service服务, ...

  5. JS常用时间处理方法

    这里会扩展一些JS常用时间处理方法,内置时间对象的方法不再赘述 -- 传送门:http://www.w3school.com.cn/js/jsref_obj_date.asp 时间格式化 -- 转换为 ...

  6. 组件--Fragment(碎片)第二篇详解

    感觉之前看的还是不清楚,重新再研究了一次 Fragment常用的三个类: android.app.Fragment 主要用于定义Fragment android.app.FragmentManager ...

  7. 应输入 #endregion 指令报错的排查技巧

    VS2010中错误排查的一个小技巧,欢迎大家吐槽: 错误    9    应输入 #endregion 指令sses.cs    3778    2  xxx.xx   这个错很明显,是缺少#endr ...

  8. ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例

    原文出自:https://blog.csdn.net/seesun2012 思路: 1.加载页面,加载Ext.TaskManager.start()方法: 2.执行定时器方法: 3.获取地址向后台发送 ...

  9. Java常用的排序算法三

    Merge Sort :归并排序:用递归的思想,分解成单个元素的排序,在归并 代码: import java.util.*; public class MergeSort { public stati ...

  10. WPF实现动画的几种方式及其小案例

    WPF实现动画的方式: 基于计时器的动画 建立一个定时器,然后根据其频率循环调用函数或者一个事件处理函数,在这个函数中可以手工更新目标属性,直到达到最终值,这时可以停止计时器. 案例: 效果图: XA ...