Description

题库链接

刚开始你有一个数字 \(0\) ,每一秒钟你会随机选择一个 \([0,2^n-1]\) 的数字,与你手上的数字进行或( \(\text{or}\) )操作。选择数字 \(i\) 的概率是 \(p_i\) 。保证 \(0\leq p_i\leq 1\) , \(\sum_{i=0}^{2^n-1}p_i=1\) 。问期望多少秒后,你手上的数字变成 \(2^n-1\) 。

\(1\leq n\leq 20\)

Solution

不妨假设第 \(i\) 秒后状态为 \(S\) 的概率为 \(fp_{i,S}\)

显然 \(i=1\) 时, \(fp_{1,S}=p_S\) 。

注意到 \(fp\) 会满足这样的关系

\[fp_{i,S} = \sum_{L \subseteq S} \sum_{R \subseteq S}^{} [L \cup R = S] fp_{i-1,L} \times p_R\]

记 \(U=2^n-1\) ,于是我们可以得到答案就是

\[\sum_{i=1}^\infty i(fp_{i,U}-fp_{i-1,U})\]

其中 \(fp_{i,U}-fp_{i-1,U}\) 表示恰好第 \(i\) 时变为 \(U\) 的概率。

记 \(FP\) 为 \(fp\) 的莫比乌斯变换,记 \(P\) 为 \(p\) 的莫比乌斯变换。显然 \(FP_{i,S}=P_S^i\) 。

那么对于集合 \(S\) 在莫比乌斯变换下得到的答案就是

\[\begin{aligned}&\sum_{i=1}^\infty i(P_S^i-P_S^{i-1})\\=&\begin{cases}-(P_S^0
+P_S^1+\cdots+P_S^\infty)&P_S<1\\0&P_S=1\end{cases}\\=&\begin{cases}-\frac{1}{1-P_S}&P_S<1\\0&P_S=1\end{cases}\end{aligned}\]

然后再反演回去直接得到答案即可。复杂度 \(O(n2^n)\) 。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 25, SIZE = (1<<20)+5;
const double eps = 1e-7; int bin[N], n;
double p[SIZE]; void FMT(double *f, int o) {
for (int i = 1; i < bin[n]; i <<= 1)
for (int j = 0; j < bin[n]; j++)
if (i&j) f[j] += f[j^i]*o;
}
void work() {
scanf("%d", &n); bin[0] = 1;
for (int i = 1; i <= n; i++) bin[i] = (bin[i-1]<<1);
for (int i = 0; i < bin[n]; i++) scanf("%lf", &p[i]);
FMT(p, 1);
for (int i = 0; i < bin[n]; i++)
if (fabs(p[i]-1) <= eps) p[i] = 0;
else p[i] = 1./(p[i]-1.);
FMT(p, -1);
p[bin[n]-1] <= eps ? puts("INF") : printf("%.7lf\n", p[bin[n]-1]);
}
int main() {work(); return 0; }

[HAOI 2015]按位或的更多相关文章

  1. 解题:HAOI 2015 按位或

    题面 Min-Max容斥:对于集合S $min(S)=\sum_{s∈S}(-1)^{|s|+1}max(s)$ $max(S)=\sum_{s∈S}(-1)^{|s|+1}min(s)$ 那么这个题 ...

  2. cogs 1963. [HAOI 2015] 树上操作 树链剖分+线段树

    1963. [HAOI 2015] 树上操作 ★★★☆   输入文件:haoi2015_t2.in   输出文件:haoi2015_t2.out   简单对比时间限制:1 s   内存限制:256 M ...

  3. 树上操作[HAOI 2015]

    树链剖分裸题: 树剖点这里:传送门 代码: #include<bits/stdc++.h> #define sight(c) ('0'<=c&&c<='9') ...

  4. [bzoj 4034][HAOI 2015]树上操作

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

  5. [HAOI 2015]树上染色

    Description 题库链接 给出一棵 \(n\) 个节点的树,边有权值.让你将树上 \(k\) 个点染黑,剩余 \(n-k\) 个点染白.染色后记一种染色方案的价值为黑点间两两距离和以及白点间两 ...

  6. 【HAOI 2015】 树上操作

    [题目链接] 点击打开链接 [算法] 树链剖分 子树的DFS序是连续的一段! [代码] #include<bits/stdc++.h> using namespace std; #defi ...

  7. 洛谷P3178[HAOI]2015 树上操作

    题目 树剖裸题,这个题更可以深刻的理解树剖中把树上的节点转换为区间的思想. 要注意在区间上连续的节点,一定是在一棵子树中. #include <bits/stdc++.h> #define ...

  8. [总结]其他杂项数学相关(定理&证明&板子)

    目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...

  9. NOI 2015 滞后赛解题报告

    报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...

随机推荐

  1. SpringMvc在返回数据之前进行统一处理

    这里其实有多种解决方案 如果你不需要获取request对象 可以采用aop(环绕通知)的方式来统一修改 如果你需要获取request对象,那么就需要采用下面的方式 0自己定义一个注解,内容如下 @Ta ...

  2. hibernate的Could not execute JDBC batch update错误原因及处理

    http://blog.csdn.net/derpvailzhangfan/article/details/2332795\ 上述问题: 一设置关联 二包含关键字 三 映射文件设置 catalog=“ ...

  3. Linux下nautilus的右键快捷菜单项设置

    某一天我的Linux更新完后, 我照常在文件夹下点击右键想打开终端, 却发现右键快捷菜单没有Open in terminal的菜单项了. 在网上查找了一下, 结合自己系统的情况发现了解决办法. 由于我 ...

  4. UML标准建模语言与应用实例

    一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...

  5. codeforces 1042 e

    逆推期望 #include<bits/stdc++.h> using namespace std; #define ll long long #define pb(x) push_back ...

  6. 利用nodejs安装并运行express的三个坑

    概述 这是我安装并运行express的三个坑,应该是比较常见的,在此记录一下. 内容 express不是内部或外部命令 输入命令:express -V 报错:'express' 不是内部或外部命令,也 ...

  7. debian安装tftp服务

    步骤1:安装 apt-get install tftp-hpa tftpd-hpa tftp-hpa是client,tftpd-hpaserver 步骤2:建立tftp目录 mkdir /tftpbo ...

  8. Liferay开发人员培训计划

    第1节 1.介绍适合和不适合Liferay的一些应用领域2.安装Liferay开发环境,下载Liferay源码:3.配置Liferay bundle.Liferay SDK,配置数据库:4.Lifer ...

  9. python 牛客网 你的输出为:空。请检查一下你的代码,有没有循环输入处理多个case。问题解决

    你的输出为:空.请检查一下你的代码,有没有循环输入处理多个case.点击查看如何处理多个case 核心:他这个程序测试正确与否的流程是 连续输入多组测试数据进行测试,只有每组数据都对才行 所以必须使用 ...

  10. SQL Server性能优化(12)非聚集索引的组合索引存储结构

    一,非聚集索引组合索引 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引).但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引.当表的行数远远大于索引键的数目时,使用这种方式可以 ...