[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 ...
随机推荐
- elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记
做全文搜索,es比较好用,安装可能有点费时费力.mysql安装就不说了.主要是elastic8.4.0+kibana8.4.0+logstash-8.16.1,可视化操作及少了netcore查询代码. ...
- pdf.js 笔记
1.介绍 官方文档,pdf.js是由mozilla开源的js库,用于在web环境中渲染和显示pdf文档 目前,绝大多数PC浏览器都已经内置了pdf阅读器,能够直接预览pdf文件(内置了pdf.js), ...
- Vue.js slot插槽
1.插槽的基本用法 组件的插槽允许用户将其他组件或者html片段插入到组件当中 // App.vue <template> <div id="app"> & ...
- 通用的定时任务工具 schedule-server
背景: 我曾经在一个自动化测试平台中集成定时任务,基于 APScheduler 库花了好长时间解决重复执行的问题.定时任务集成在服务中也让服务变得复杂.最后,我们选择了公司其他团队go语言开发的一个定 ...
- orangepi zero3开启指定频段WiFi热点的指令
步骤 通过 -c 命令即可指定wifi频段,避免和其他wifi的频段撞在一起. 例如下面这条命令创建了一个频段为40,WiFi名为zero3,网段为192.168.12.0/24的WiFi热点 sud ...
- 【Amadeus原创】SQL Server数据库备份、差异备份、日志备份脚本
1,sp脚本 USE [master] GO /****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 2021/1 ...
- Qt编写安防视频监控系统24-自定义悬浮条
一.前言 自定义悬浮条功能集成在通用视频控件中,就是提供一个顶部的悬浮条,放一排功能按钮,有抓拍.录像.云台控制.关闭等,相当于可以直接单击对应的按钮针对该通道的视频进行操作,悬浮条的含义就是鼠标移入 ...
- 基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v6.2版已发布
关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持UDP .TCP .WebSocket 三种协议,支持iOS.A ...
- Object.freeze冻结属性和v-if结合requestAnimationFrame分帧渲染解决白屏
计算100W条数据的长度造成2s延迟 <template> <div> <h1>数据总长度{{ arrList.length }}</h1> </ ...
- 获取不同型号手机小程序导航栏的高度(uniapp)
uni.getSystemInfo({ success: function(e) { Vue.prototype.StatusBar = e.statusBarHeight; let custom = ...