当前位置: 首页 > 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.gsyq.cn/news/1396015.html

相关文章:

  • 2026年5月劳力士腕表保养服务收费标准及口碑深度核验 - 资讯快报
  • Mozilla推Firefox全新设计系统Project Nova:隐私功能前置,兼顾速度与界面体验
  • 昇腾CANN cann-recipes-infer 仓:Stable Diffusion 推理加速方案
  • 2026年,程序员的核心竞争力不再是写代码——而是驾驭AI的能力
  • 基于氧化产物描述符与机器学习的高熵合金高温抗氧化性预测与设计
  • JMeter压测不是点开始:17个决定成败的关键节点
  • Mi-Create:为什么这款免费工具能让普通用户轻松设计小米手表表盘?
  • 利用 Taotoken 模型广场为 Agent 应用选择合适的模型
  • 成人专业智商测试题|权威 IQ 测试完整版入口 - 时讯资讯
  • 【MySQL 教程(五)】SQL函数详解:字符、数字、日期、转换与通用函数
  • GitHub中文化插件:5分钟快速实现英文界面全面汉化的完整指南
  • 从“懵”到“懂”:NPN与PNP三极管的实战识别与开关电路搭建
  • 将OpenClaw智能体工作流接入Taotoken的配置要点解析
  • Kohya_SS:定制化AI绘画模型的工程实践指南
  • 别再手动点工具了!用ArcGIS ModelBuilder把重复性空间分析打包成‘一键工具’
  • 如何快速掌握MulimgViewer:新手必备的多图像浏览器使用指南
  • 最新2026年5月,根据行业抓取抖音爆款视频;
  • 在 OpenClaw 中配置 Taotoken 作为 Agent 的模型供应商
  • 影刀RPA店群自动化可视化调试与全链路追踪:问题定位效率提升10倍的工程实践
  • AI生图踩坑?100r得到可直接投稿的矢量图
  • 神经网络与深度学习笔记2
  • OpenCLAW实战:CUDA内核高效迁移指南
  • 在多轮对话应用中观测不同模型的 Token 消耗与性价比
  • 不止于AC:用洛谷P1803线段覆盖题,带你深入理解贪心算法的‘局部最优’证明
  • MyBatis 字段映射
  • GeoDa:从零到一的空间数据探索
  • 从E1帧到2.048Mbit/s:深入解析PCM30/32路系统的帧结构与传输效率
  • 3个技巧让你在数字课堂中重获学习主动权
  • Poppins字体:如何用一款免费开源字体解决多语言排版难题?
  • 上海制造/工程类企业财税服务避坑指南+靠谱机构盘点 - 资讯速览