[BZOJ3811] 玛里苟斯 题解
不得不说这题的确挺苟的。
注:下述“引理”表示:
对于长度为 \(n\) 的数组 \(V\),其线性基为 \(B\),定义 \(c_v=\bigoplus\limits_{a\in v}a\),\(num_k=\sum\limits_{v\subseteq V}[c_v=k]\),则 \(\forall k\in\mathbb{N},num_k\in\{0,2^{n-|B|}\}\)。
对于 \(k=1\) 的情况,容易想到按位分类,所有能取到的二进制位,最终的异或和中为 \(1\) 的概率都为 \(\frac 12\),证明相当于是杨辉三角的一行,奇数位之和和偶数位之和相等,很容易证明。这一部分时间复杂度 \(O(n+\log V)\)。
对于 \(k=2\) 的情况,根据 \((a+b)^2=a^2+b^2+2ab\),考虑拆成 \(a^2\) 和 \(ab\) 两部分考虑。\(a^2\) 和原先处理方法一样,\(ab\) 的概率为 \((\frac 12)^2=\frac 14\)。但是假如在所有 \(a_i\) 中,这两位都是同时出现或同时消失,那么就还是 \(\frac 12\)。时间复杂度 \(O(n+\log^2 V)\)。
接下来的部分可以继续这样推下去,但是 我觉得再推下去我就要死了,所以考虑暴力枚举所有可能值。根据引理,可得所有出现过的异或和出现次数都一样,问题转化为所有可能的异或和求和。由于实际上 \(V=\sqrt[k]{V'}\),所以当 \(k>2\) 时,\(V\le 2^{22}\),那么直接建立线性基后暴力搜索即可。时间复杂度 \(O(n+V)\)。
实际上,容易证明 \(\{ans\}\in\{0,0.5\}\),所以只需要在计算答案时整体 \(\times 2\),输出时特判即可避免小数运算。
#include<bits/stdc++.h>
#define int unsigned long long
#define iint __int128
using namespace std;
const int N=1e5+5,M=65;
int n,k,ans,a[N],fl[M][M];
int p[M],fg[M];iint sm;
void add(int x){
for(int i=30;~i;i--)
if(x&(1ull<<i)){
if(p[i]) x^=p[i];
else{p[i]=x;return;}
}
}iint pp(int x){
iint re=1;
for(int i=0;i<k;i++) re*=x;
return re;
}iint sum(int nw,int x){
if(nw+1==0) return sm++,pp(x);
if(!p[nw]) return sum(nw-1,x);
iint re=sum(nw-1,x^p[nw]);
return re+sum(nw-1,x);
}void solve1(){
for(int i=1;i<64;i++)
if(fg[i]) ans+=(1ull<<(i-1));
cout<<ans<<(fg[0]?".5":"");
}void solve2(){
for(int i=0;i<33;i++)
for(int j=i+1;j<33;j++) fl[i][j]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<33;j++) for(int l=j+1;l<33;l++)
fl[j][l]&=(((a[i]>>j)&1)==((a[i]>>l)&1));
for(int i=0;i<33;i++){
if(!fg[i]) continue;
for(int j=i+1;j<33;j++){
if(!fg[j]) continue;
ans+=(1ull<<(i+j+fl[i][j]));
}ans+=(1ull<<(2*i));
}cout<<ans/2<<(ans%2?".5":"");
}void solve3(){
iint cc=sum(30,0)*2;
ans=(int)(cc/sm);
cout<<ans/2<<(ans%2?".5":"");
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i],add(a[i]);
for(int j=0;j<64;j++)
fg[j]|=((a[i]>>j)&1);
}if(k==1) solve1();
else if(k==2) solve2();
else solve3();
return 0;
}
[BZOJ3811] 玛里苟斯 题解的更多相关文章
- BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...
- bzoj3811 玛里苟斯
分三种情况讨论 k=1时,对于每一位而言,只要有一个数这一位是1,那么这个就有0.5的概率是1,选他就是1,不选就是0,有第二个的话,在第一个选或不选的前提下,也各有0.5的几率选或不选,0和1的概率 ...
- 【BZOJ3811】玛里苟斯(线性基)
[BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...
- 【bzoj3811】【清华集训2014】玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 500 Solved: 196[Submit][Status][Discuss] ...
- 【BZOJ3811/UOJ36】 玛里苟斯
Description 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,…,an}. 等概率随机取 S 的一个子集 A={ai1,… ...
- bzoj3811 uoj36 玛里苟斯
做题前问了一下miaom,得到了一个奇怪的回答 mmp 这题分类讨论 k=1sb题 k=2按位计算,把每个数看成几个2的幂次的和,按位跑期望 k>2线性基sb题 没了 #include<i ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
随机推荐
- Vue.js 组件数据交互
1.前言 本节讲述组件之间如何进行数据交互 2.props属性与非 prop 的属性 父组件通过属性绑定的形式传值给子组件,这种传值分2种 类别 含义 说明 props 子组件本身已经通过props定 ...
- a标签与Blob下载文件的区别和获取文件下载进度
文件下载的几种方式. 大家都做过文件下载,无非就是通过a标签给定一个href. 用户点击下载按钮. 或者使用Blob的方式进行下载. 这两种是很常见的,也是我们平时做使用最多的方式. 那么我们知道这2 ...
- Qt No Target Architecture
在QT中引入processthreadsapi.h,如果出现 "No Target Architecture",需要在processthreadsapi.h前引入windows.h ...
- 在 ASP.NET Core 中使用 Tailwind
在 ASP.NET Core 中使用 Tailwind https://khalidabuhakmeh.com/install-tailwind-css-with-aspnet-core 表单和函数是 ...
- 技术实践|Redis基础知识及集群搭建(下)
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享 ...
- 【转载】 《SpringBoot2.0 实战》系列-集成Quartz定时任务(持久化到数据库)
https://blog.csdn.net/HXNLYW/article/details/95055601 一.增加依赖 我们使用的spring-boot-starter-quartz,所以不用显示指 ...
- Compile error: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags
reno@MyComputer:~/tools/cmake-3.12.4$ ./configure --------------------------------------------- CMak ...
- java判断反射的Field是不是用final修饰
今天调用Field.set方法报错: Caused by: java.lang.IllegalAccessException: Can not set static final long field ...
- Qt音视频开发34-不同库版本不同位数的库和头文件的引用
一.前言 做开发过程中难免遇到需要引入第三方库的时候,而且需要在不同库版本.不同系统.不同位数下都需要.第三方的库版本众多,一般在大版本中的小版本都是兼容的,但是大版本不兼容,比如ffmpeg目前就有 ...
- Qt开源作品36-程序守护进程
一.前言 没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到, ...