[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 ...
随机推荐
- MarkDown文档的编写
MarkDown的基本语法 MarkDown的标题语法 通过#进行创建标题,#的数量控制标题的级别 MarkDown的段落语法 通过空白行将一行或者多行文本进行分隔 MarkDown的强调语法 粗 ...
- Jetpack Compose学习(15)——Pager组件的使用(对标ViewPager)
原文地址: Jetpack Compose学习(15)--Pager组件的使用(对标ViewPager)-Stars-One的杂货小窝 从名字可以看出,Pager这个就是ViewPager的替代产物 ...
- Debian 12 (bookworm) 安装方法及其国内软件源
摘要: Debian 12 (bookworm) 已经于2023年6月份正式发布.以下为原来信息: Debian 12 (bookworm) 预计于2023年中期发布,但是目前(2023年4月)已经处 ...
- Java中SPI机制原理解析
使用SPI机制前后的代码变化 加载MySQL对JDBC的Driver接口实现 在未使用SPI机制之前,使用JDBC操作数据库的时候,一般会写如下的代码: // 通过这行代码手动加载MySql对Driv ...
- Qt编写监控Onvif综合示例(支持云台/预置位/抓图/事件订阅等)
一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...
- Qt编写本地摄像头综合应用示例(qcamera/ffmpeg/v4l2等)
一.功能特点 同时支持 qcamera.ffmpeg.v4l2 三种内核解析本地摄像头. 提供函数 findCamera 自动搜索环境中的所有本地摄像头设备,搜索结果信号发出. 支持自动搜索和指定设备 ...
- Qt编写地图综合应用44-悬浮工具条
一.前言 百度地图内置了悬浮工具条,可以自行开启,包括离线地图也可以开启,用到了DrawingManager这个库,鼠标绘制工具条库,提供鼠标绘制点.线.面.多边形(矩形.圆)的编辑工具条的开源代码库 ...
- AICA第6期-学习笔记汇总
AICA第6期-学习笔记汇总 AICA第六期|预科班课程 1.<跨上AI的战车> 2.<产业中NLP任务的技术选型与落地> 3.<计算机视觉产业落地挑战与应对> 4 ...
- KES的执行计划分析与索引优化
今天我们继续探讨国产数据库KES的相关内容,本次的讨论重点将放在SQL优化的细节上.作为Java开发人员,我们通常并不需要深入了解数据库的底层实现细节,而是更多地关注如何提升应用性能与数据库的交互效率 ...
- 小程序获取定位完整的封装js(uniapp)
1.小程序获取定位,首先需要在微信公众平台,申请getLocation接口(开发管理->接口设置) 2.在manifest.json打开源码视图,增加代码 "mp-weixin&quo ...