[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 ...
随机推荐
- 深入理解java虚拟机一之走进Java
Java技术体系 Java程序设计语言.Java虚拟机.Java API类库统称为JDK Java API类库中Java SE API子集和Java虚拟机统称为JRE Java发展史 1991年4月 ...
- SQL Server使用证书最小粒度授权
最近在项目中某个功能遇到了阻塞造成的Time out错误.所以需要在执行该功能的时候开启一个线程检测SQL Server中阻塞会话.但是程序本身使用的sql帐号本身不具备VIEW Sever Stat ...
- 理解Time-Wait
What is it? TIME-WAIT状态的主要作用在于TCP连接的拆除阶段.拆除一个TCP连接通常需要交换4个segment,如下图所示: Host1上的应用程序关闭了自己这一端的连接,使得TC ...
- unable to load http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
问题:unable to load http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl 解决:yum -y inst ...
- 一个可遇不可求的 bug 全局变量初始化顺序问题 哈哈
这是今天下午帮同事查的一个客户端 C++ 的 bug,前人留下的谜之代码.. 具体情况是,客户端实现了有一个简单的内存池,每次申请内存的时候会把新申请到的内存信息存到一个 map 里,据说是为了检查内 ...
- MongoDB 数据库
数据库: 关系型数据库 mysql 收费 速度快 字段类型 非关系型数据库 MongoDB 不收费 速度慢一些 存储数据都是字符串 ...
- SQL注入之重新认识
i春秋作家:anyedt 原文来自:https://bbs.ichunqiu.com/thread-41701-1-1.html 引言 作为长期占据 OWASP Top 10 首位的注入,认识它掌握它 ...
- vsftpd安装配置以及常见问题解决
vsftpd安装配置以及踩坑解决办法,Centos7 nginx已经配置成功了,但是使用http始终没办法访问到图片,那么你来对地方了(在文章末尾是原因) 配置nginx教程:http://blog. ...
- Redis简明教程
redis是什么: Redis is an open source, BSD licensed, advanced key-value store. It is often referred to a ...
- Redis 分布式锁进化史(解读 + 缺陷分析)
Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...