BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献。由组合数的一些性质非常容易证明。
k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率。找出所有存在的相互绑定的位,这些位被同时选择的概率为0.5,而不被绑定的则为0.25。
对于k>=3,其实用与k=1,2相同的方法大力讨论也可以做。考虑更优美的做法。有一个性质:集合内数相互异或不影响答案。证明比(bing)较(bu)显(hui)然(xie)。于是构造出线性基。可以发现线性基里的元素很少,暴搜一发即可。
卡精度,不会证地有答案一定是整数或.5,全程整数各种乱搞即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
#define ll unsigned long long
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,cnt=;
ll a[N],base[],b[];
bool flag[],f[][];
ll ans,tot;
void getbase()
{
for (int i=;i<=n;i++)
{
ll x=a[i];
for (int j=;~j;j--)
if (x&(1ll<<j))
if (base[j]) x^=base[j];
else {base[j]=x;break;}
}
for (int j=;~j;j--)
if (base[j]) b[++cnt]=base[j];
}
void solve1()
{
for (int i=;i<;i++) if (flag[i]) ans+=1ll<<i-;
cout<<ans;if (flag[]) cout<<".5";
}
void solve2()
{
for (int i=;i<;i++)
for (int j=;j<;j++)
f[i][j]=;
for (int i=;i<=n;i++)
for (int j=;j<;j++)
for (int k=j+;k<;k++)
if (((a[i]&(1ll<<j))>)^((a[i]&(1ll<<k))>)) f[j][k]=f[k][j]=;
for (int i=;i<;i++)
if (flag[i])
for (int j=;j<;j++)
if (flag[j])
{
if (!f[i][j]) ans+=(1ll<<i+j);
else ans+=(2ll<<i+j);
tot+=ans/,ans%=;
}
cout<<tot;if (ans) cout<<".5";
}
void solve3(int k,ll s)
{
if (k>cnt)
{
ll t=s*s*s;t/=(<<cnt);for (int i=;i<=m;i++) t*=s;tot+=t;
t=s*s*s;t%=(<<cnt);for (int i=;i<=m;i++) t*=s;
ans+=t;tot+=ans/(<<cnt);ans%=(<<cnt);
}
else solve3(k+,s),solve3(k+,s^b[k]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3811.in","r",stdin);
freopen("bzoj3811.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
{
a[i]=read();
for (int j=;j<;j++) if (a[i]&(1ll<<j)) flag[j]=;
}
if (m==) solve1();
if (m==) solve2();
if (m>=)
{
getbase(),solve3(,);
cout<<tot;if (ans) cout<<".5";
}
return ;
}
BZOJ3811 玛里苟斯(线性基+概率期望)的更多相关文章
- uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...
- UOJ#36. 【清华集训2014】玛里苟斯 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...
- BZOJ.3811.玛里苟斯(线性基)
BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...
- [清华集训2015 Day1]玛里苟斯-[线性基]
Description Solution 考虑k=1的情况.假设所有数中,第i位为1的数的个数为x,则最后所有的子集异或结果中,第i位为1的个数为$(C_{k}^{1}+C_{k}^{3}+...)$ ...
- bzoj3811 玛里苟斯
分三种情况讨论 k=1时,对于每一位而言,只要有一个数这一位是1,那么这个就有0.5的概率是1,选他就是1,不选就是0,有第二个的话,在第一个选或不选的前提下,也各有0.5的几率选或不选,0和1的概率 ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- 【BZOJ3811】玛里苟斯(线性基)
[BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...
- bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...
- UOJ #36 -【清华集训2014】玛里苟斯(线性基+暴搜)
UOJ 题面传送门 看到 \(k\) 次方的期望可以很自然地想到利用低次方和维护高次方和的套路进行处理,不过.由于这里的 \(k\) 达到 \(5\),直接这么处理一来繁琐,二来会爆 long lon ...
随机推荐
- 【转载】C/C++杂记:虚函数的实现的基本原理
原文:C/C++杂记:虚函数的实现的基本原理 1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: ...
- js Date对象要注意的问题(时间转换)
1.时间戳和时间对象可以灵活转变: let n = new Date() // 返回的是当前时间对应的国际时间 let nt =n.getTime() let n2 =new Date(nt) con ...
- JUnit在intellij idea中只能在test里面才能使用,否则不能添加import
只能在 src下的test下使用 不能再main下使用 否则不能import到指定的junit包 idea这样做的好处就是分离主项目和测试项目,这样一来就能够更加方便的测试了 如图直接这样把整个主包 ...
- asp.net core webapi项目配置全局路由
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在开发项目的过程中,我新创建了一个controller,发现vs会给我们直接在controller头添加前缀,比如[Ro ...
- JavaScript正则表达式练习
校验邮政编码(由六位组成). var reg = /^\d{6}$/; var str = "130400"; var b = str.match(reg); if (b === ...
- 怎样安装TortoiseGit
TortoiseGit是基于Windows的Git图形化工具 访问 https://tortoisegit.org/
- Jenkins配置 管理
Jenkins配置 你可能已经看了前面几次练习了,其中我们不得不在Jenkins配置选项.下表列出了Jenkins 的各种配置选项. 因此,可以通过点击左侧菜单侧的 “Manage Jenkins”选 ...
- Centos7下安装Seafile实现私有网盘
Seafile是一个开源.专业.可靠的云存储平台:解决文件集中存储.共享和跨平台访问等问题,由北京海文互知网络有限公司开发,发布于2012年10月:除了一般网盘所提供的云存储以及共享功能外,Seafi ...
- boot,rebuild,resize,migrate有关的scheduler流程
代码调用流程: 1. nova.scheduler.client.query.SchedulerQueryClient#select_destinations 2. nova.scheduler.rp ...
- LVM缩小根分区
逻辑卷不是根分区都可以在线扩容和缩小 根分区是可以在线扩容,但不可以在线缩小 Linux系统进入救援模式 依次选择: 欢迎界面 ---------- Rescue installed system C ...