当前位置: 首页 > news >正文

P3175 [HAOI2015] 按位或 - Link

题意

你有一个数 \(x\),初始时 \(x=0\),每次按照给定的概率选择一个 \(y\in[0,s^n-1]\),把你 \(x\) 变成 \(x|y\)。问期望几次,能让 \(x\) 变成 \(2^n-1\)
\(n\le20\)

思路

\(\max(S)\) 表示 \(S\) 中最晚的那个位置出现的时间,\(\min(S)\) 表示 \(S\) 中最近的那个位置出现的时间。
根据 \(min-max\) 反演,有 \(\max(S)=\sum_{T\subseteq S,T\not=\emptyset}(-1)^{|T|+1}\min(T)\),两边加上期望,变成 \(E(\max(S))=\sum_{T\subseteq S,T\not=\emptyset}(-1)^{|T|+1}E(\min(T))\)。考虑如何求 \(\min(S)\)。设选到和 \(S\) 有交集的数的概率和为 \(p\),那么 \(\min(S)=p+(1-p)(\min(S)+1)\),得 \(\min(S)=\frac 1p\),而 \(p\) 可以用子集求和求出。
时间复杂度 \(\mathcal O(n2^n)\)

代码

// Problem: P3175 [HAOI2015] 按位或
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3175
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=1100000;
int n;
double f[maxn];
signed main(){read(n);for(int i=0;i<(1<<n);i++) scanf("%lf",f+i);for(int j=0;j<n;j++) for(int i=0;i<(1<<n);i++) if(i&(1<<j)) f[i]+=f[i^(1<<j)];double ans=0;for(int i=1;i<(1<<n);i++){int sz=0,val=0;for(int j=0;j<n;j++) if(((1<<j)&i)==0) val+=(1<<j);else sz++;if(1-f[val]<1e-10){write("INF");return 0;}if(sz&1) ans+=1/(1-f[val]);else ans-=1/(1-f[val]);}if(isinf(ans)) write("INF");else printf("%.10lf",ans);return 0;
}
http://www.jsqmd.com/news/892594/

相关文章:

  • 2026年android开发板供应商终极测评:工业嵌入式方案对比与推荐 - 品牌报告
  • 企业用工合规培训体系,广东劳大状,打造企业内部合规管理能力 - 资讯速览
  • 从Linux内核到你的项目:揭秘C语言中‘虚函数表’的经典实现与避坑指南
  • 为什么92%的独立游戏团队放弃自建社区?Lovable开源栈替代方案深度评测(含性能压测数据)
  • 如何永久免费使用IDM下载管理器?开源激活脚本完整指南
  • 没有团队怎么创业?OPC模式:一个人完成过去一个公司的商业闭环
  • 从零到上线仅需1天,AI Agent低代码平台选型对比:8大厂商实测数据深度曝光
  • 基于网络表示学习与SVR的关键节点识别算法NRL_KNI详解
  • 2026年,程序员的核心竞争力不再是写代码——而是驾驭AI的能力
  • 高校如何建设OPC产业学院?海南师范大学案例深度复盘
  • 5G NR LDPC码(2)—— 从基图到速率匹配的标准化设计全解析
  • 从配置到调试:Quartus ALTPLL IP核实战避坑指南
  • 2025年专访AI短剧平台盈利实操心得
  • js之 原型prototype
  • 3步掌握Buzz离线语音转文字:保护隐私的全能音频转录解决方案
  • 【Coze工作流】告别重复劳动效率翻番,日常办公必看
  • 成人专业智商测试题|权威 IQ 测试完整版入口 - 时讯资讯
  • 重新定义人机协作:Claude AI深度评测与实战体验
  • 专业守护腕表时光 宝珀售后服务深度解读2026年6月最新 - 资讯快报
  • DIY一个姿态传感器模块:基于AT32F421和ICM42670的硬件连接、软件滤波与3D可视化
  • 实测Taotoken平台GPT模型API调用的响应延迟与稳定性表现
  • OpenCLAW实战:CUDA内核高效迁移指南
  • 保姆级教程:在CentOS 7上为Doris 1.0配置MySQL ODBC外部表(从驱动安装到查询测试)
  • 影刀RPA拼多多/TEMU店群自动化:SLA体系与可用性度量实战
  • 从E1帧到2.048Mbit/s:深入解析PCM30/32路系统的帧结构与传输效率
  • 将OpenClaw智能体工作流接入Taotoken的配置要点解析
  • Kohya_SS:定制化AI绘画模型的工程实践指南
  • 从“懵”到“懂”:NPN与PNP三极管的实战识别与开关电路搭建
  • 别再手动点工具了!用ArcGIS ModelBuilder把重复性空间分析打包成‘一键工具’
  • 2025年AI短剧靠谱厂家 东营优腾登TOP榜