题目大意:刚开始有一个数$x=0$,每秒钟有一个数$y\in[0,2^n)(n\leqslant20)$按一定概率随机出现,数$i$的概率为$p_i$,保证$\sum\limits_{i=0}^{2^n-1}p_i=1$。然后$x\to x|y$,问期望多少时间后,$x=2^n-1$

题解:$Min-Max$容斥
$$
\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\min(T)\\
\min(S)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\max(T)
$$
而且,它在期望下成立,即:
$$
E(\max(S))=\sum\limits_{T\subseteq S}(-1)^{|T|+1}E(\min(T))\\
E(\min(S))=\sum\limits_{T\subseteq S}(-1)^{|T|+1}E(\max(T))
$$
这道题相当于求$E(\max(S))$,也就是说,现在需要求$E(\min(S))$。令$s(S)$表示随机出来的数$y\in S$的概率,即$\sum\limits_{y\in S}p_y$,这可以用$FWT$解决。

求$E(\min(S))$,就枚举选了多少次数与$S$都没有交
$$
\begin{align*}
E(\min(S))&=\sum\limits_{i=0}^{\infty}s(\bar S)^i(i+1)(1-s(\bar S))\\
&=(1-s(\bar S))\dfrac1{(1-s(\bar S))^2}\\
&=\dfrac1{1-s(\bar S)}
\end{align*}
$$
然后$Min-Max$容斥一下就好了

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#define N 1048576 | 3 int lim, U;
void FWT(double *A) {
for (int mid = 1; mid < lim; mid <<= 1)
for (int i = 0; i < lim; i += mid << 1)
for (int j = 0; j < mid; ++j) A[i + j + mid] += A[i + j];
} int n;
double p[N], s[N], f[N];
int main() {
scanf("%d", &n); lim = 1 << n, U = lim - 1;
for (int i = 0; i < lim; ++i) scanf("%lf", p + i);
std::copy(p, p + lim, s);
FWT(s);
for (int i = 0; i < lim - 1; ++i) if (s[i] == 1) {
puts("INF");
return 0;
}
for (int i = 1; i < lim; ++i) f[i] = 1 / (1. - s[U ^ i]); double ans = 0;
for (int i = 1; i < lim; ++i) {
if (__builtin_popcount(i) & 1) ans += f[i];
else ans -= f[i];
}
printf("%.6lf\n", ans);
return 0;
}

  

[洛谷P3175][HAOI2015]按位或的更多相关文章

  1. 洛谷 P3175 [HAOI2015]按位或

    题目分析 与hdu4336 Card Collector相似,使用min-max容斥. 设\(\max(S)\)表示集合\(S\)中最后一位出现的期望时间. 设\(\min(S)\)表示集合\(S\) ...

  2. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  3. bzoj4036 / P3175 [HAOI2015]按位或

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

  4. BZOJ4033或洛谷3177 [HAOI2015]树上染色

    BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...

  5. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  6. 洛谷P3178 [HAOI2015]树上操作

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  7. luogu P3175 [HAOI2015]按位或

    传送门 如果每个位置上的数字的意义是这个位置被加进集合的最早时间,那么我们要求的就是集合中最大数的期望,使用Min-Max容斥,\(E(max(S))=\sum_{T\subset S}(-1)^{| ...

  8. P3175 [HAOI2015]按位或

    传送门 一如既往膜拜shadowice巨巨 前置姿势我就没一个会的-- //minamoto #include<bits/stdc++.h> #define R register #def ...

  9. 洛谷 P3177 [HAOI2015]树上染色

    题目链接 题目描述 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个 ...

随机推荐

  1. while循环计算规则:内循环—外循环!

    num= 1 #值 =1while num <= 10 : # num(1)小于10 print(num) # 应该打印 这个1的值 num +=1 # num+=1等价于 num再加1 所以这 ...

  2. Docker Manager for Kubernetes

    一.Kubernetes介绍 Kubernets是Google开源的容器集群系统,是基于Docker构建一个容器的调度服务,提供资源调度,均衡容灾,服务注册,动态伸缩等功能套件: Kubernets提 ...

  3. lua栈

    既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.,先关注的是Lua栈的分配,管理和相关的 ...

  4. Catlike学习笔记(1.2)-使用Unity画函数图像

    『Catlike系列教程』第二篇来了~今天周六,早上(上午11点)醒来去超市买了一周的零食回来以后就玩了一整天游戏非常有负罪感.现在晚上九点天还亮着感觉像下午7点左右的样子好像还不是很晚...所以就写 ...

  5. 信息提示 - bootStrap4常用CSS笔记

    .alert 基类 .alert-{success.info.warning.danger.primary.secondary.light.dark} 各种类型的配色样式 .fade..show 设置 ...

  6. 快速获取APP对应的appPackage和appActivity

    appPackage和appActivity 进行appium自动化测试非常重要的两个参数,我们所测试的APP不同,这两个参数肯定也是不一样的. 介绍两种方法可快速获取APP的这两个参数: 方法一 1 ...

  7. C#如何在各类控件中输入\输出数据

    文本框:TextBox Text - 按钮文字 TextBox.text=""; s=TextBox.text; 单选按钮+复选按钮 RadioButton,CheckBox Te ...

  8. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第5节: 同线程回收对象

    Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第五节: 同线程回收对象 上一小节剖析了从recycler中获取一个对象, 这一小节分析在创建和回收是同线程的 ...

  9. 初学node.js-nodejs中实现HTTP服务(3)

    一.node.js实现服务端 创建hello-world-server.js文件,服务端源码如下: /** * node.js实现http服务端 */ var http = require('http ...

  10. 字符串匹配:KMP算法, Boyer-Moore算法理解与总结

    1. KMP算法是前缀匹配算法,一次从前往后匹配的过程中,根据已经部分匹配的信息,在文本中,移动尽可能远的距离.而不是按照朴素模式匹配方法,每次都只移动一个位置. 比如这个示例,在文本串中从4(从0开 ...