1 前言

大概又是Min-Max容斥与FMT的裸题吧
刚学完Min-Max容斥,式子推的飞快

2 题目相关

2.1 题目大意

一开始你手上有一个数000,每次或上随机一个在[0,2n)[0,2^n)[0,2n)中的数(给出随到每个数的概率),求期望多少步你手上的数变为2n−12^n-12n−1

2.2 数据范围

n≤20n\le 20n≤20,所有概率的输入以及期望步数的输出都使用实数

3 题解

我们发现我们可以直接Min-Max容斥
max{S}=∑T⊆S(−1)∣T∣+1min{T}max\{S\}=\sum_{T\subseteq S}(-1)^{|T|+1}min\{T\}max{S}=T⊆S∑​(−1)∣T∣+1min{T}
我们发现max{S}max\{S\}max{S}相当于是变为2n−12^n-12n−1的期望步数,min{T}min\{T\}min{T}代表进行操作与集合TTT有交的期望步数
我们就可以直接做了
我们知道,如果求出了min{T}min\{T\}min{T}我们可以直接Θ(2n)\Theta(2^n)Θ(2n)计算答案了
考虑如何计算min{T}min\{T\}min{T}
设取到SSS的概率为gSg_SgS​,我们发现min{S}=11−∑T∩S=∅gTmin\{S\}=\frac{1}{1-\sum_{T\cap S=\varnothing}g_T}min{S}=1−∑T∩S=∅​gT​1​
我们相当于要求fS=∑T∩S=∅gTfS=∑T∩(CuS)=TgTfS=∑T⊆(CuS)gT\begin{aligned} f_{S}&=\sum_{T\cap S=\varnothing}g_T\\ f_{S}&=\sum_{T\cap(Cu_S)=T}g_T\\ f_{S}&=\sum_{T\subseteq(Cu_S)}g_T\\ \end{aligned}fS​fS​fS​​=T∩S=∅∑​gT​=T∩(CuS​)=T∑​gT​=T⊆(CuS​)∑​gT​​
然后翻转一下,就是子集卷积了,使用FMT即可
非常方便

4 代码

贴上我写的第一份代码(未卡常版本)

#include<cstdio>
#include<cctype>
#include<algorithm>
namespace fast_IO
{const int IN_LEN=10000000,OUT_LEN=10000000;char ibuf[IN_LEN],obuf[OUT_LEN],*ih=ibuf+IN_LEN,*oh=obuf,*lastin=ibuf+IN_LEN,*lastout=obuf+OUT_LEN-1;inline char getchar_(){return (ih==lastin)&&(lastin=(ih=ibuf)+fread(ibuf,1,IN_LEN,stdin),ih==lastin)?EOF:*ih++;}inline void putchar_(const char x){if(oh==lastout)fwrite(obuf,1,oh-obuf,stdout),oh=obuf;*oh++=x;}inline void flush(){fwrite(obuf,1,oh-obuf,stdout);}
}
using namespace fast_IO;
#define getchar() getchar_()
#define putchar(x) putchar_((x))
#define rg register
typedef long long LL;
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline void mind(T&a,const T b){a=a<b?a:b;}
template <typename T> inline void maxd(T&a,const T b){a=a>b?a:b;}
template <typename T> inline T abs(const T a){return a>0?a:-a;}
template <typename T> inline void swap(T&a,T&b){T c=a;a=b;b=c;}
template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);}
template <typename T> inline T lcm(const T a,const T b){return a/gcd(a,b)*b;}
template <typename T> inline T square(const T x){return x*x;};
template <typename T> inline void read(T&x)
{char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;
}
double xs[11][10];
template <typename T> inline void Read(T&x)
{char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(cu=='.'){cu=getchar();int t=0;while(isdigit(cu))x+=xs[++t][cu-'0'],cu=getchar();}if(fla)x=-x;
}
template <typename T> inline void printe(const T x)
{if(x>=10)printe(x/10);putchar(x%10+'0');
}
template <typename T> inline void print(const T x)
{if(x<0)putchar('-'),printe(-x);else printe(x);
}
int bit[21],n,lenth;
double g[2097152],ans;
bool pc[2097152];
int main()
{xs[0][1]=1;for(rg int i=1;i<=10;i++){xs[i][1]=xs[i-1][1]/10;for(rg int j=1;j<=9;j++)xs[i][j]=xs[i][1]*j;}bit[0]=1;for(rg int i=1;i<=20;i++)bit[i]=bit[i-1]<<1;read(n),lenth=bit[n];for(rg int i=lenth-1;i>=0;i--)Read(g[i]);for(rg int i=1;i<lenth;i<<=1)for(rg int j=0;j<lenth;j+=(i<<1))for(rg int k=0;k<i;k++)g[j+k]+=g[j+k+i];const int Low=lenth-1;for(rg int i=1;i<lenth;i++){pc[i]=pc[i>>1]^(i&1);if(g[i]>=0.999999999){puts("INF");return flush(),0;}if(pc[i])ans+=1.0/(1-g[i]);else ans-=1.0/(1-g[i]);}printf("%.8lf",ans);return flush(),0;
}

5 总结

这道题我进行了一波卡常(你看我写的第一份代码已经用实数读优了)
然后我学习到了一个小技巧
这题里的FMT我用的是FWTand的写法(写FWTor也可以,反正不是两重循环的)
然后对于FWT,将最底下的两层单独提出来用for循环做,速度会有明显的提升
就不贴卡常后的代码了

[HAOI2015][loj2127]按位或相关推荐

  1. 【LOJ2127】「HAOI2015」按位或

    题意 刚开始你有一个数字 \(0\),每一秒钟你会随机选择一个 \([0,2^n-1]\) 的数字,与你手上的数字进行或操作.选择数字 \(i\) 的概率是 \(p[i]\) . 问期望多少秒后,你手 ...

  2. LOJ#2127「HAOI2015」按位或

    用$ Min-Max$容斥之后要推的东西少了好多 无耻的用实数快读抢了BZOJ.Luogu.LOJ三个$ OJ$的Rank 1 即将update:被STO TXC OTZ超了QAQ 题意:集合$ [0 ...

  3. 【HAOI2015】按位或【Min-Max容斥】【FWT】

    传送门 题意:开始时你有一个数000,每次选出[0,2n−1][0,2^n-1][0,2n−1]中的一个数进行按位或,每个数选中的概率给定.求得到2n−12^n-12n−1的期望操作次数. 1≤n≤2 ...

  4. 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  5. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  6. [HAOI2015]按位或

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

  7. 模板:min-max容斥离散随机变量的几何分布(洛谷P3175:[HAOI2015]按位或)

    前言 见到一道神题,学会两个知识点- 都是数学. min-max容斥 给出式子: max⁡(S)=∑T⊂S(−1)∣T∣min⁡(T)\max(S)=\sum_{T\sub S}(-1)^{|T|}\ ...

  8. P3175 [HAOI2015]按位或

    传送门 一如既往膜拜shadowice巨巨 前置姿势我就没一个会的-- //minamoto #include<bits/stdc++.h> #define R register #def ...

  9. python 中 (按位与) 和 | (按位或)

    python 中 & (按位与) 和 | (按位或) 是把 2个数据转为二进制然后在做相应的计算 下面详细说下 a = 10 # 10的二进制为1010 b = 18 # 18的二进制为100 ...

最新文章

  1. linux apache 手动安装教程,linux下手动安装apache
  2. linux 内核编译错误 gcc: error: elf_i386: No such file or directory
  3. CubieBoard开发板数据源介绍
  4. 伪站创建代码-山东理工
  5. AI算法工程师必备技术,快快积累!
  6. 给服务器端下拉asp:DropDownList 绑定改变事件,Ajax绑定下拉
  7. iptables基础概念
  8. Surface平面计算机
  9. HTML5CSS3网页设计仿微信通讯录页
  10. 苹果更新系统微信收不到服务器,苹果手机升级iOS12后微信无法提示新消息的解决办法 亲测有效...
  11. 读书笔记:打造知识体系
  12. 工厂都离不开的“人机料法环”
  13. cad怎么画立体图形教学_cad怎么绘立体图?
  14. k8s源码分析 pdf_我是怎么阅读kubernetes源代码的?
  15. java xtend_Java加上Xtend,满足你对C#语法的所有想象
  16. (十七)QT生成PDF文件
  17. linux系统(压缩与解压缩,系统管理)
  18. 当神经网络的模型还不如决策树的效果好
  19. cocos2dx配置Android环境最新教程
  20. 联通保定服务器稳定吗,保定联通5G网络正式开通!贴心“秘籍”教您5G网络的正确打开方式...

热门文章

  1. SpringMVC的请求-获得请求参数-获得基本类型参数
  2. 常用的函数式接口_Function接口
  3. SVN打分支及主干合并到分支
  4. 后台服务系统之编写服务提供方实现
  5. 缺省参数-回顾列表的排序方法明确缺省参数的概念及作用
  6. 图的最短路径(一级)
  7. Dubbox-REST风格
  8. jsonp java后台_jsonp与Java后端
  9. java存储三元组_在4store中添加三元组
  10. vue -- 动态加载组件 (tap 栏效果)