P3175 [HAOI2015] 按位或(min-max 容斥)

news/2024/12/22 21:48:43/文章来源:https://www.cnblogs.com/dcytrl/p/18622533

题意

有一个初始为 \(0\) 的变量 \(x\),每次操作会以 \(p_i\) 的概率选择位于 \([0,2^n)\) 中的某个整数 \(i\),并将 \(x\) 或上 \(i\)。问期望几次操作后 \(x=2^n-1\)

\(n\le 20,\sum p_i=1\)

引入:min-max 容斥

以两个式子入手:

\[\max(S)=\sum_{T\subseteq S} (-1)^{|T|+1}\min(T) \]

\[\min(S)=\sum_{T\subseteq S} (-1)^{|T|+1}\max(T) \]

两个式子的证明都大差不差,不妨证明第一个。

\(S=\{a_1,a_2,\cdots,a_n\}\),其中 \(a_1<a_2<\cdots<a_n\),考虑拆贡献,求出每个 \(a_i\)\(\max(S)\) 的贡献的系数是多少。

不妨钦定 \(a_i\) 就是 \(\min(T)\),那么 \(a_i\) 往后的元素都可以任意选,那 \(a_i\) 的系数就是 \(\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}\),这里是 \((-1)^j\) 不是 \((-1)^{j+1}\) 的原因是我们已经钦定 \(a_i\) 选了,所以少乘一个 \(-1\) 的系数。二项式定理可得 \(\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}=(1-1)^{n-i}=[n=i]\)。也就是说,如果 \(a_i\) 不是 \(a_n\) 那么系数为 0,否则为 1。\(a_n\) 即是最大值,得证。

这个东西在一般的求最小值的题目下可能没啥用,但是这个东西在期望的意义下也是成立的(期望的线性性),即:

\[E(\max(S))=\sum_{T\subseteq S} (-1)^{|T|+1}E(\min(T)) \]

\[E(\min(S))=\sum_{T\subseteq S} (-1)^{|T|+1}E(\max(T)) \]

\(E(\max)\)\(E(\min)\) 不好求且另外一个相对好求时,我们可以使用 min-max 容斥解决题目。

分析

\(x\) 拆位,设 \(t_i\) 表示第 \(i\) 位变成 1 的时刻,那么我们要求的就是 \(E(\max(t_i))\)

考虑 min-max 容斥,将式子变为 \(\sum_{T\subseteq \{1,2,\cdots,n\},T\neq \emptyset} E(\min(T))\)

我们有结论:设 \(p\) 表示选中与 \(T\) 有交的数的概率,那么有 \(E=\frac{1}{p}\)

证明:

将期望按照定义展开,\(E=p(1-p)^0+2p(1-p)^1+3p(1-p)^2+\cdots\),考虑错位相减,\((1-p)E=p(1-p)^1+2p(1-p)^2+3p(1-p)^3+\cdots\),相减得 \(pE=p(1-p)^0+p(1-p)^1+p(1-p)^2+\cdots\),也即 \(E=(1-p)^0+(1-p)^1+(1-p)^2+\cdots\),套用等比数列求和公式得 \(E=\frac{1}{p}\)

当然也有另外一种证法,考虑 DP,将 \(E\) 视为一个 DP 状态,有转移 \(E=1+(1-p)E\),意义就是,我花费了一次操作,如果随到了与 \(T\) 有交的数(概率为 \(p\)),就结束了,否则要继续操作,此时局面和操作前一样,所以从 \((1-p)E\) 转移来。解方程得 \(E=\frac{1}{p}\)

问题转化成了求 \(p\)。正着做稍微有点困难,考虑求选中与 \(T\) 无交的数的概率,即 \(1-p\),不难发现这其实就是 \(T\) 的补集的所有子集的概率之和,高维前缀和即可。

还有一个小细节,当 \(p=0\) 时,此时 \(\frac{1}{p}\) 等于无穷大,所以要再开一个数组 \(cnt\) 记录 \(\frac{1}{0}\) 的系数是多少,若不为 0 则输出 INF。

时间复杂度 \(O(n2^n)\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<array>
#include<ctime>
#include<random>
#include<cassert>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define all(x) x.begin(),x.end()
#define mem(x,y) memset(x,y,sizeof x)
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) ((x)&-(x))
#define lson(x) ((x)<<1)
#define rson(x) ((x)<<1|1)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
using i64=long long;
using u64=unsigned long long;
using pii=pair<int,int>;
template<typename T1,typename T2>inline void ckmx(T1 &x,T2 y){x=x>y?x:y;}
template<typename T1,typename T2>inline void ckmn(T1 &x,T2 y){x=x<y?x:y;}
inline auto rd(){int qwqx=0,qwqf=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')qwqf=-1;ch=getchar();}while(ch>='0'&&ch<='9'){qwqx=(qwqx<<1)+(qwqx<<3)+ch-48;ch=getchar();}return qwqx*qwqf;
}
template<typename T>inline void write(T qwqx,char ch='\n'){if(qwqx<0){qwqx=-qwqx;putchar('-');}int qwqy=0;char qwqz[40];while(qwqx||!qwqy){qwqz[qwqy++]=qwqx%10+48;qwqx/=10;}while(qwqy--)putchar(qwqz[qwqy]);if(ch)putchar(ch);
}
bool Mbg;
const int maxn=21,maxm=(1<<20),inf=0x3f3f3f3f;
const double eps=1e-10;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,m;
double a[maxm],f[maxm];
inline void solve_the_problem(){n=rd(),m=(1<<n);rep(i,0,m-1)scanf("%lf",&a[i]);rep(i,0,m-1)f[i]=a[i];rep(j,0,n-1)rep(i,0,m-1)if((i>>j)&1)f[i]+=f[i^(1<<j)];double ans=0;int cnt=0;rep(S,1,m-1){double p=1-f[(m-1)^S];int siz=__builtin_popcount(S);if(p<eps){if(siz&1)++cnt;else --cnt;}else{if(siz&1)ans+=1.0/p;else ans-=1.0/p;}}if(cnt)puts("INF");else printf("%.9lf",ans);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);int _=1;while(_--)solve_the_problem();
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux编写一个自己的命令

Linux编写一个自己的命令 编译一个.c文件,生成可执行文件out。out只有在当前目录下可以执行。 而命令可在任何路径执行想让out可以在任意路径执行,有以下两种办法 1、将执行文件添加到 /bin/ 路径下(专门存放可执行文件)添加到 /bin/ 路径下后,在任何路径都可识别到程序2、…

离开Jetbrains拥抱VsCode: 离开大便拥抱大便

文章讨论了作者从Jetbrains转向VsCode的原因,主要集中在AI编程支持和个性化体验上。Jetbrains在AI Coding的支持方面表现不佳,如更新速度慢、功能不足等,使得作者感到不满;而Jetbrains自己开发的AI Assistant也未能提供满意的体验。相对而言,VsCode在插件系统和自由度上表…

第十一篇:下载网站与动态网站架构

视频下载网站网站名:视频下载网站 域名:video.download.cn 站点目录:/app/code/vide/ 需求:浏览器打开后,显示目录结构 增加svip认证功能 增加统计功能(统计nginx服务的访问等状态)autoindex模块 自动索引功能(列表站点目录的内容),首页文件不存在autoindex模块 说明…

P1438 无聊的数列

链接:https://www.luogu.com.cn/problem/P1438 题面:思路: 差分+线段树。 刚开始的想法是建立一个双tag线段树:basetag和addtag。然后传递的时候basetag就是l的基准,addtag不变。求的话就是求节点值。 但是这样容易溢出。。。 所以考虑差分:利用前缀和代替当前某一点的值…

2024.12.22

数学归纳法常用公式\((a+b)^n\) \((a+b)^n\)的系数是杨辉三角的某一层,a升幂排列,b降幂排列 同理可得\((a-b)^n\),可以看作(\(a+(-b))^2\),与上面相同。

【PHP安全】php程序源码保护技术

一、基本介绍二、加密方式2.1 源码混淆处理2.1.1 PHP 威盾混淆2.1.2 php-obfuscator2.2 YAK Pro混淆处理2.3 源码外壳加密2.3.1 PHP Eval加密2.3.2 PHP Eval变异2.3.3 phpjiami处理2.4 源码扩展加密2.4.1 php-beast2.4.2 Zend Guard文末小结一、基本介绍 PHP语言作为脚本语言的…

[长期活动] 【4Z-API】每5楼抽取1位送10美金API额度,20%中奖机会!

​ 活动详情 活动时间: 长期有效 奖励内容: 每5楼抽取1位幸运用户,送价值10美金API额度 ** 参与方式** 登录 4Z API域名巧记:ZZZZAPI.com 4个Z然后API 简单好记:4Z= ZZZZAPI.com 每5个楼层将抽取1位幸运用户4Z-API优势稳定高速的API服务超值定价,性价比之选7x24小时技术支持…

CW信号的正交解调

1.CW信号CW可以叫做等幅电报,它通过电键控制发信机产生短信号"."(点)和长信号"--"(划),并利用其不同组合表示不同的字符,从而组成单词和句子。CW信号可以看作一种幅度调制信号,类似于幅移键控(2ASK信号)其携带的信息保存在其幅度中,通过改变载波…

团队作业3

团队作业3--需求改进&系统设计这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13233这个作业的目标 修改完善需求规格说明书、系统设计、Alpha任务分配计划、测试计…

Authz0:自动化授权测试工具

免责声明 本文提供的资源仅供学习,利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,本文及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介 Authz0 是一款自动化授权测试工具。可以根据URL和角色与凭证识别未经授权的访问。URL和角…

戴尔T3680工作站 改造虚拟工作站,满足多人设计需求

在戴尔 T3680 工作站作为通过了 NVIDIA vWS兼容性认证的工作站,部署 Proxmox VE 和 DoraCloud,可以实现工作站虚拟化,满足多个用户设计需求。可以顺畅运行 SolidWorks、NX/UG 等大型CAD软件。满足企业 资源共享、信息安全、远程设计的业务需求。最近拿到一台 戴尔 T3680 工作…

HDU3746-Cyclic Nacklace

继续跟着邝斌飞刷KMP HDOJ3746 百度的时候发现题目英语弄错了,项链英文是Necklace,不是Nacklace读完之后我滴妈,上难度了呀 题意:就是给你个字符串a~z,,###:妈逼的不知道咋回事百度那个搜索不知道是不是总更新网页html一些东西,ADblock拦截又tm不好使了,还得重新拦截。…