BZOJ 4036 [HAOI2015] Set 解题报告
2015-07-13 11:07
375 查看
首先我们不能一位一位的考虑,为什么呢?
你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀。(我是因为这样子弄没过样例才明白的)
所以我们还是要想想其他的方法。
我们是要算步数的期望,然而步数是一个离散的整数,所以我们可以把问题转化一下:
$$E(s) = \sum_{k=1}^{\infty}P(s\ge k)$$
然后就好做了嘛。
我们可以求出一个 $F_i = \sum_{j\subseteq i} p_j$,表示随机选一个数是 $i$ 的子集的概率。
那么就会有:
$$P(s\ge k) = \sum_{i=0}^{2^n-1}(-1)^{c(i)+n+1}\times F_i^{k-1}$$
其中 $c(i)$ 表示 $i$ 的二进制表示中 $1$ 的个数。以上的式子也就是一个容斥的样子,其实说起来就是位运算卷积。然后于是就有:
$$E(s) = \sum_{i=0}^{2^n-1} (-1)^{c(i)+n+1}\sum_{k=0}^{\infty}F_i^{k-1} = \sum_{i=0}^{2^n-1} \frac{(-1)^{c(i)+n+1}}{1 - F_i}$$
然后好像就做完啦。
时间复杂度 $O(n\times2^n)$,空间复杂度 $O(2^n)$。
4036_Gromah
你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀。(我是因为这样子弄没过样例才明白的)
所以我们还是要想想其他的方法。
我们是要算步数的期望,然而步数是一个离散的整数,所以我们可以把问题转化一下:
$$E(s) = \sum_{k=1}^{\infty}P(s\ge k)$$
然后就好做了嘛。
我们可以求出一个 $F_i = \sum_{j\subseteq i} p_j$,表示随机选一个数是 $i$ 的子集的概率。
那么就会有:
$$P(s\ge k) = \sum_{i=0}^{2^n-1}(-1)^{c(i)+n+1}\times F_i^{k-1}$$
其中 $c(i)$ 表示 $i$ 的二进制表示中 $1$ 的个数。以上的式子也就是一个容斥的样子,其实说起来就是位运算卷积。然后于是就有:
$$E(s) = \sum_{i=0}^{2^n-1} (-1)^{c(i)+n+1}\sum_{k=0}^{\infty}F_i^{k-1} = \sum_{i=0}^{2^n-1} \frac{(-1)^{c(i)+n+1}}{1 - F_i}$$
然后好像就做完啦。
时间复杂度 $O(n\times2^n)$,空间复杂度 $O(2^n)$。
#include <cstdio> typedef long double LD; #define N 1 << 20 #define eps 1e-11 int n, Op ; LD A ; int main() { scanf("%d", &n); Op[0] = n & 1 ? 1 : -1; for (int i = 0; i < (1 << n); i ++) { double x; scanf("%lf", &x); A[i] = x; if (i > 0) Op[i] = -Op[i - (i & -i)]; } for (int k = 1; k < (1 << n); k <<= 1) for (int i = 0; i < (1 << n); i ++) { if (i & k) continue ; A[i + k] += A[i]; } bool ok = 1; for (int i = 0; ok && i < (1 << n) - 1; i ++) if (A[i] + eps > 1) ok = 0; if (!ok) puts("INF"); else { LD ans = 0; for (int i = 0; i < (1 << n) - 1; i ++) ans += Op[i] / (1 - A[i]); printf("%.10lf\n", (double) ans); } return 0; }
4036_Gromah
相关文章推荐
- Android(java)学习笔记125:Clock app编写报错02
- JavaScript 代码片段
- POJ 1462
- 自定义标签。毫秒时间转换成yyyy-MM-dd格式显示
- 硬编码和软编码
- 关于为何设立<样本分析>这个栏目的问答及暂用分析报告格式
- HDU 4391 Paint The Wall 段树(水
- c++标准库IO
- Flex4.6开发问题[1]-HSlider
- 树中两个节点的最低公共祖先
- [leetcode] 236.Lowest Common Ancestor of a Binary Tree
- ORACLE 常用kill表锁命令
- 自动化维护任务 – Automated Maintenance Task
- 协定需要双工,但是绑定“WSHttpBinding”不支持它或者因配置不正确而无法支持它
- Caffe框架安装类问题整理
- Hibernate_Notes_2_helloworld_详解_及session一级缓存
- Svchost.exe 占用过高内存 导致电脑卡
- GetPrivateProfileString函数--INI配置文件
- 【问底】王帅:深入PHP内核(二)——SAPI探究
- 坐在马桶上看算法:快速排序