BZOJ 4036 [HAOI2015] Set 解题报告
首先我们不能一位一位的考虑,为什么呢?
你想想,你如果一位一位地考虑的话,那么最后就只有 $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[N];
LD A[N]; int main()
{
scanf("%d", &n);
Op[] = n & ? : -;
for (int i = ; i < ( << n); i ++)
{
double x;
scanf("%lf", &x);
A[i] = x;
if (i > ) Op[i] = -Op[i - (i & -i)];
}
for (int k = ; k < ( << n); k <<= )
for (int i = ; i < ( << n); i ++)
{
if (i & k) continue ;
A[i + k] += A[i];
}
bool ok = ;
for (int i = ; ok && i < ( << n) - ; i ++)
if (A[i] + eps > ) ok = ;
if (!ok) puts("INF");
else
{
LD ans = ;
for (int i = ; i < ( << n) - ; i ++)
ans += Op[i] / ( - A[i]);
printf("%.10lf\n", (double) ans);
} return ;
}
4036_Gromah
BZOJ 4036 [HAOI2015] Set 解题报告的更多相关文章
- [BZOJ 4036][HAOI2015]按位或
4036: [HAOI2015]按位或 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 746 Solved: 4 ...
- BZOJ 4619 Swap Space 解题报告
今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 2839: 集合计数 解题报告
BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...
- bzoj 4036 [HAOI2015]按位或——min-max容斥+FMT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 题解:https://www.cnblogs.com/Zinn/p/10260126. ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
- BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演
http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/5 ...
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- BZOJ 4341 [CF253 Printer] 解题报告
乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...
- BZOJ 3288 Mato矩阵 解题报告
这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...
随机推荐
- java内存被释放的小例子
先贴代码: StringBuilder dada = null; ; i<; i++){ dada = new StringBuilder(); ; j<; j++){ dada.appe ...
- 使用Xpath从网页中获取数据
/// <summary> /// 从官方网站中抓取产品信息存放在本地数据库中 /// </summary> /// <returns></returns&g ...
- 分享我的2014年3月unity3d面试题与参考答案
今年3月份面试unity3d游戏程序,先做的面试题,然后人事问了我几个之前游戏开发的问题,问我英语怎么样等等,介绍了公司情况和对unity3d程序的要求.之后就回来了,总共面了不到1个半小时吧.笔试答 ...
- Linux C编程--格式化I/O
printf(格式控制,输入表列) 例:printf("%d%d",a,b) (1)d格式符:输出一个有符号的十进制整数 (2)c格式符:输出一个字符 (3)s格式符:输出一个字符 ...
- MTKLogger日志记录打开
MTKLogger在 拨号界面用*#446633#(不同手机可能设置不一样) 向左滑动到Log and Debugging下面有个MTKLogger,点进去 点击右上角进入设置,打开MobileLog ...
- 北大ACM(POJ1002-487-3279)
Question:http://poj.org/problem?id=1002问题点:字符映射.选重复项及排序. Memory: 1136K Time: 813MS Language: C++ Res ...
- IP地址理解_IP地址=网络地址+主机地址,但是具体前面多少是网络地址看题目说明
题目: 属于网络112.10.200.0/21的地址是() 112.10.206.0 112.10.217.0 112.10.224.0 112.10.198.0 分析解答: 总结: 首先,明白后 ...
- jQuery中的getter和setter方法
1.attr()方法是jQuery中用于HTML属性的getter/setter.一个相关函数是removeAttr(). 2.css()方法和attr()方法很类似,只是css()方法作用于元素的c ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发
Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...
- 使用WM_PASTE 和 WM_CHAR 消息时中文乱码总结
当我们需要设置编辑框显示文本的时候,如果其它方式无法实现,可以试试WM_PASTE 和 WM_CHAR. 但使用这两种消息很容易出现中文乱码的情况,这一般是编码问题,可参考如下几点: 1,中文应采用U ...