[HAOI 2015]按位或
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]按位或的更多相关文章
- 解题: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)$ 那么这个题 ...
- cogs 1963. [HAOI 2015] 树上操作 树链剖分+线段树
1963. [HAOI 2015] 树上操作 ★★★☆ 输入文件:haoi2015_t2.in 输出文件:haoi2015_t2.out 简单对比时间限制:1 s 内存限制:256 M ...
- 树上操作[HAOI 2015]
树链剖分裸题: 树剖点这里:传送门 代码: #include<bits/stdc++.h> #define sight(c) ('0'<=c&&c<='9') ...
- [bzoj 4034][HAOI 2015]树上操作
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- [HAOI 2015]树上染色
Description 题库链接 给出一棵 \(n\) 个节点的树,边有权值.让你将树上 \(k\) 个点染黑,剩余 \(n-k\) 个点染白.染色后记一种染色方案的价值为黑点间两两距离和以及白点间两 ...
- 【HAOI 2015】 树上操作
[题目链接] 点击打开链接 [算法] 树链剖分 子树的DFS序是连续的一段! [代码] #include<bits/stdc++.h> using namespace std; #defi ...
- 洛谷P3178[HAOI]2015 树上操作
题目 树剖裸题,这个题更可以深刻的理解树剖中把树上的节点转换为区间的思想. 要注意在区间上连续的节点,一定是在一棵子树中. #include <bits/stdc++.h> #define ...
- [总结]其他杂项数学相关(定理&证明&板子)
目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...
- NOI 2015 滞后赛解题报告
报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...
随机推荐
- 项目部署到服务器上之后request.getRemoteAddr()为什么获取的都是本地地址
获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了.如 ...
- ActiveMQ_2安装
Linux安装 环境JDK7以上 gz文件拷贝到 /usr/local/目录下 解压 后缀为 .tar.gz的压缩包 进入解压后的文件夹 cd apache-activemq-x.xx.x/ cd b ...
- MFC字体样式和颜色设置
在编写MFC界面程序时,可能会使用不同大小或者颜色的字体,这里稍做记录. 使用方法 CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->C ...
- Java程序员职业生涯规划完整版:从程序员到CTO( 摘)
在技巧方面无论我们怎么学习,总感觉需要晋升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高等特性 反射.泛型. ...
- redis 集群模式安装
概念 Redis集群提供一种方式自动将数据分布在多个Redis节点上. 每个Redis集群中的节点都需要打开两个TCP连接.一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口( ...
- TensorFlow环境搭建
1.使用pip安装TensorFlow 第一步安装pip: 先安装python 官网下载地址https://www.python.org在里面选择适合自己的版本 安装python的过程中pip也会随之 ...
- orabbix监控oracle
Orabbix 是一个用来监控 Oracle 数据库实例的 Zabbix 插件.下载地址: http://www.smartmarmot.com/product/orabbix/download/ O ...
- 启动 mysql 时报错
通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时 报错 "can't connect to local mysql serverthrough socket'/var/ ...
- Maven的多mirrors的配置
repo1 central Human Readable Name for this Mirror. http://repo1.maven.org/maven2/ repo2 central Huma ...
- Python序列结构--列表(一)
列表 列表**包含若干元素的有序连续内存空间**,当列表增加或删除元素时,**列表对象自动进行内存的扩展或收缩**,从而**保证相邻元素之间没有缝隙**.但插入和删除非尾部元素时涉及列表元素大量的移动 ...