按位或「HAOI2015」

题意

刚开始你有一个数字\(0\),每一秒钟你会随机选择一个\([0,2^n-1]\)的数字,与你手上的数字进行或(c++,c的|,pascal的or)操作。选择数字\(i\)的概率是\(p[i]\)。保证\(0<=p[i]<=1\),\(Σp[i]=1\)问期望多少秒后,你手上的数字变成\(2^n-1\)。

思路

minmax容斥加上高维前缀和。

minmax容斥就是两个式子:

\[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(S))\)表示\(S\)中最大的元素的期望,反之亦然。

这个东西的证明需要使用二项式反演,但我并不会,所以只好先背结论。如果要看证明可以去这里

对于本题,如果我们把所有位被填上的期望时间放到一个集合里,那么求的答案就是这个集合的最大值,发现符合我们式子的左半边。

那么式子右边就是至少有一个数字出现的期望时间。这里需要用到一个结论:\(MIN(T)\)的期望为其概率的倒数。(这个证明不是很复杂,这里不放了)

那么有\(E(MIN(T))=\frac{1}{\sum_{s'\cap T\neq 0}~~P_{s'}}\)(公式好像有点抽搐)

但是求相交不是很容易,所以我们转换为求不相交,这个比较简单,也就是

\[E(MIN(T))=\frac{1}{1-\sum_{s'与T没有相交}~~~~~P_{s'}}\]

分母后面那个东西可以表示为\[\sum_{s'\subseteq (2^n-1-T)}P_{s'}\]

而这个东西可以高维前缀和搞,于是这道题就结束了。

代码

#include <bits/stdc++.h>

using namespace std;

namespace StandardIO{

    template<typename T>inline void read(T &x){
        x=0;T f=1;char c=getchar();
        for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
        for(; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
        x*=f;
    }

    template<typename T>inline void write(T x){
        if(x<0) putchar('-'),x*=-1;
        if(x>=10) write(x/10);
        putchar(x%10+'0');
    }

} using namespace StandardIO;

namespace Project{

    const int N=1<<21;

    int n,tot;
    double p[N];
    int num[N];
    double ans;

    inline void MAIN(){
        read(n);
        for(register int i=0; i<(1<<n); ++i){
            scanf("%lf",&p[i]);
            if(p[i]) tot|=i;
        }
        if(tot!=(1<<n)-1) return puts("INF"),void();
        for(register int i=1; i<(1<<n); ++i) num[i]=num[i>>1]+(i&1);
        for(register int i=0; i<n; ++i){
            for(register int j=0; j<(1<<n); ++j){
                if(j&(1<<i)) p[j]+=p[j^(1<<i)];
            }
        }
        for(register int i=1; i<(1<<n); ++i){
            ans+=(num[i]&1?1.0:-1.0)/(1.0-p[((1<<n)-1)^i]);
        }
        printf("%.6lf",ans);
    }

}

int main(){
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    Project::MAIN();
}

原文地址:https://www.cnblogs.com/ilverene/p/11843381.html

时间: 2024-11-10 22:39:22

按位或「HAOI2015」的相关文章

loj10139. 「一本通 4.5 练习 1」树上操作(loj2125. 「HAOI2015」树上操作 )

思路: 第二遍dfs时记录end[x]为在结点序列中以x为根的子树最后访问的节点,写个线段树标记下传即可.与值有关的数据注意long long #include<cstdio> #include<iostream> #include<vector> #include<cmath> #include<string> using namespace std; const int maxn = 100010; inline void qread(int

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

开放的智力8:实用「成功学」

可实现的「成功学」 现在我想为这里的年轻人介绍一种可实现的「成功学」.希望这个我自创的理论,可以改变很多人的一生. 当我们评价一个事情值不值得去做.应该花多少精力去做的时候,应该抛弃单一的视角,而是分两个不同的维度来看,一是该事件将给我带来的收益大小(认知.情感.物质.身体方面的收益皆可计入),即「收益值」:二是该收益随时间衰减的速度,我称为「收益半衰期」,半衰期长的事件,对我们的影响会持续得较久较长. 这两个维度正交以后就形成了一个四象限图.我们生活.学习和工作中的所有事情都可以放进这个图里面

Linux 小知识翻译 - 「syslog」

这次聊聊「syslog」. 上次聊了「日志」(lgo).这次说起syslog,一看到log(日志)就明白是怎么回事了.syslog是获取系统日志的工具. 很多UINIX系的OS都采用了这个程序,它承担了「获取系统全部的日志」这个维持系统正常运行的重要任务. syslog的本体是「syslogd」这个daemon(一般翻译成守护进程),常驻内存中获取日志. syslog的特点是可以通过配置文件「/etc/syslog.conf」,对「哪种应用程序?哪种重要度的信息?记录在哪个文件中?」等进行细致的

Linux 小知识翻译 - 「日志」(log)

这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录了系统和软件详细运行情况的「日志」是信息的宝库,通过日志来解决问题的事例也非常多. 但事实上,「无论如何也不会看日志」的用户也有很多.理由很简单,日志的信息量非常大,全部用眼睛来看的话是非常吃力的. 而且,英语写的日志也会让英文不好的人敬而远之. 虽说「要养成用眼睛来看日志的习惯」,但实行起来却非常

Linux 小知识翻译 - 「补丁」(patch)

这次,聊聊补丁. 当有bug或者安全漏洞的时候,就会发布补丁.打上补丁之后,就能解决相应的bug或者安全漏洞. 那么,「补丁」到底是什么呢? 「补丁」只有少量的代码,一般都是对程序的一部分进行更新或者追加,包括bug修正,安全漏洞修正,功能追加或者变更等等.当然,只有「补丁」是无法运行的. 即,只有将「补丁」附加到原来的程序中,更新原来的程序后,才能运行. 「补丁(patch)」本来是指「打补丁用的小布头」.「patch」正是为了补足现有的程序,堵住程序漏洞的「布头」. 打「补丁」的时候需要用到