题目链接:洛谷

题目大意:给定正整数 $n$。一开始有一个数字 $0$,然后每一秒,都有 $p_i$ 的概率获得 $i$ 这个数 $(0\le i< 2^n)$。一秒恰好会获得一个数。每获得一个数,就要将我们有的数与获得的数进行按位或。问期望经过多少秒后,我们的数变成 $2^n-1$。

$1\le n\le 20,\sum p_i=1$。


%%%stO shadowice1984 Orz%%%

首先定义 $\min(S)$ 表示 $S$ 中第一个变为 $1$ 的元素的时间。(其中 $S$ 是一个二进制数,是 $1$ 的位表示这一位计入答案)

$\max(S)$ 表示最后一个变为 $1$ 的元素的时间。这也符合 $\min$ 和 $\max$ 的定义。

(以下定义全集 $U=2^n-1$)

我们要求的就是 $E(\max(U))$。

容斥:$E(\max(U))=\sum\limits_{S\neq\varnothing}(-1)^{|S|+1}E(\min(S))$

现在问题就是求 $E(\min(S))$,就是有元素变为 $1$。

套期望的公式:$E(\min(S))=\sum\limits^{+\infty}_{i=1}iP(\min(S)=i)$

$P(\min(S)=i)$ 表示恰好在第 $i$ 秒出现 $1$ 的概率。

前 $i-1$ 秒都没有出现,所以应该是 $\sum\limits_{T\cap S=\varnothing}P(T)$。其中 $P(T)$ 表示出现的数是 $T$ 的概率。

第 $i$ 秒有出现,所以应该是 $1-\sum\limits_{T\cap S=\varnothing}P(T)$。

乘法原理,$P(\min(S)=i)=(\sum\limits_{T\cap S=\varnothing}P(T))^{i-1}(1-\sum\limits_{T\cap S=\varnothing}P(T))$

那么经过一通爆算,$E(\min(S))=\dfrac{1}{1-\sum\limits_{T\cap S=\varnothing}P(T)}$。

转换一下:$E(\min(S))=\dfrac{1}{1-\sum\limits_{T\subseteq\complement_US}P(T)}$。

现在最严峻的问题就是计算每个集合的子集和。

最裸的枚举,$O(4^n)$。

技巧一点的枚举,$O(3^n)$。

那么就要说到一个很有趣的事情了,我也是做了这题才知道的……

回想一下FWT(或者FMT)做按位或卷积的时候:

$C_i=\sum\limits_{j|k=i}A_jB_k$

令 $\widehat{C}_i=\sum\limits_{j\subseteq i}C_j$

那么就有 $\widehat{C}_i=\sum\limits_{j|k\subseteq i}A_jB_k$

也就是 $\widehat{C}_i=\sum\limits_{j\subseteq i,k\subseteq i}A_jB_k$

也就是 $\widehat{C}_i=\widehat{A}_i\widehat{B}_i$!

于是需要一种从 $A$ 到 $\widehat{A}$ 的变换还有它的逆变换。

于是就有了FWT(或者FMT)……

(所以说,FWT比FFT要好理解,那就要理解啊)

那么我们就知道了,FWT的或变换一次后新的序列就是原序列的子集和形式!

好的,时间复杂度 $O(n2^n)$。

代码:(实际上特别好写)

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,cnt[maxn];
double p[maxn];
void FWTor(double *A){
for(int i=;i<<<n;i<<=)
for(int j=,r=i<<;j<<<n;j+=r)
FOR(k,,i-) A[i+j+k]+=A[j+k];
}
int main(){
n=read();
FOR(i,,(<<n)-) scanf("%lf",p+i);
FWTor(p);
FOR(i,,(<<n)-) cnt[i]=cnt[i>>]+(i&);
double ans=;
FOR(i,,(<<n)-){
if(-p[((<<n)-)^i]<1e-) return puts("INF"),;
ans+=/(-p[((<<n)-)^i])*(cnt[i]&?:-);
}
printf("%.10lf\n",ans);
}

[HAOI2015]按位或(min-max容斥,FWT,FMT)的更多相关文章

  1. bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】

    其实也不是FWT--我也不知道刷FWT专题问什么会刷出来这个东西 这是min-max容斥讲解:https://www.zybuluo.com/ysner/note/1248287 总之就是设min(s ...

  2. BZOJ4036 [HAOI2015]按位或 【minmax容斥 + 期望 + FWT】

    题目链接 BZOJ4036 题解 好套路的题啊,,, 我们要求的,实际上是一个集合\(n\)个\(1\)中最晚出现的\(1\)的期望时间 显然\(minmax\)容斥 \[E(max\{S\}) = ...

  3. P3175-[HAOI2015]按位或【min-max容斥,FWT】

    正题 题目链接:https://www.luogu.com.cn/problem/P3175 题目大意 开始有一个\(n\)位二进制数\(s=0\),每次有\(p_i\)概率选取数字\(i\)让\(s ...

  4. 【BZOJ4036】按位或(Min-Max容斥,FWT)

    [BZOJ4036]按位或(Min-Max容斥,FWT) 题面 BZOJ 洛谷 题解 很明显直接套用\(min-max\)容斥. 设\(E(max\{S\})\)表示\(S\)中最晚出现元素出现时间的 ...

  5. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

  6. 【洛谷U20626】gemo 容斥 FWT 高斯消元

    题目大意 给你一个无向图,有\(m\)个询问,每次给你一个点\(x\)和一个点集\(S\),问你从\(x\)开始走,每次从一个点随机的走到与这个点相邻的点,问你访问\(S\)中每个点至少一次的期望步数 ...

  7. BZOJ4036:按位或 (min_max容斥&高维前缀和)

    Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0&l ...

  8. 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)

    题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...

  9. Min-max 容斥与 kth 容斥

    期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...

随机推荐

  1. 蓝牙 link timeout分析

    蓝牙主机和蓝牙设备建立连接之后,会在l2cap 层面上建立相应的channel,这些channel 基本上是用于各种不同的profile 或者protocol 进行通信用的. 当相应的profile或 ...

  2. Telephone Phrases

    There are some common phrases and sentences you can use when speaking on the telephone. The informal ...

  3. mysql操作命令梳理(2)-alter(update、insert)

    在mysql运维操作中会经常使用到alter这个修改表的命令,alter tables允许修改一个现有表的结构,比如增加或删除列.创造或消去索引.改变现有列的类型.或重新命名列或表本身,也能改变表的注 ...

  4. tmux使用总结

    ctrl+b +%:增加垂直分屏 ctlr+b +左右箭头: 在垂直分屏中移动 ctrl+b+c:新建窗口(不分屏) ctrl+b+数字键: 切换窗口 ctrl+b+d: 断开窗口 tmux  a : ...

  5. Personal Reading Assignment 2 -读推荐文章有感以及项目开发目前总结

    在经过个人作业和结对作业的磨练和现在正在进行的团队作业的考验中,我对自己软件开发的一点得失有了些许感悟,同时读了老师推荐的文章后,自己也是有了一些感受. 首先在“No Silver Bullet”一文 ...

  6. Being a (amateurish) team:团队开发体会

    0x00 Being a (amateurish) team This is the process of changing hydrogen into breathable oxygen, and ...

  7. Oracle系列(一): Oracle数据恢复

     Oracle数据恢复 在使用Oracle的时候,突然一部小心update或者delete全部数据后怎么办? select * from table as of timestamp to_timest ...

  8. [转帖] iptables之四表五链

    iptables之四表五链 http://www.cnblogs.com/clouders/p/6544584.html mark 学习一下 对防火墙一无所知.. iptables可谓是SA的看家本领 ...

  9. 微信内置浏览器在使用video标签时(安卓)默认全屏的原因及解决办法

    根据X5论坛得到的答案是:设计如此. 腾讯真是越来越嚣张了,一家独大后用户体验都不注重了(不给程序员留活路). 听说有个申请加入vdeo白名单的,域名验证后就可以解决默认全屏(反正我是没见过申请入口, ...

  10. 关于python 自带csv库的使用心得 附带操作实例以及excel下乱码的解决

    因为上次帮我们产品处理过一个文件,他想生成能excel处理操作的.但是上次由于时间非常紧张,所以并没有处理好. 正好无聊就来好好研究一下 ,找算法要了几个 csv文件.来好好玩一玩. 全篇使用了pyt ...