[BZOJ 3811]玛里苟斯:线性基(详细证明)

2024-01-10 18:59

本文主要是介绍[BZOJ 3811]玛里苟斯:线性基(详细证明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(点击这里查看原题

极其复杂的题目……看了一早上题解才看懂
分类讨论
k=1时,考虑每一位对答案的影响,若至少存在一个数第j位为1,那么异或和中第j位为1的概率为0.5,否则为零。因为取到奇数个第j位为1的数的概率和取到偶数个的概率相等。
k=2时,把异或和转化为2进制,那么每个异或和的平方为 ∑ i ∑ j b i b j ∗ 2 i + j \sum _{i} \sum _{j}b_{i}b_{j}*2^{i+j} ijbibj2i+j,那么考虑第i位和第j位的积的期望值。如果所有的a[]中,第i位和第j位均相等且非全零,那么参考k=1的情况,期望为1/2;否则,i为1的概率为1/2,j位1的概率为1/2,i*j为1的概率为1/4。
k>=3时,因为答案不超过263,因此a[i]不会超过221,线性基不会超过21个,于是求出线性基后暴力枚举。
需要注意的是,答案不会溢出,但中间过程可能会,因此需要将y变成 ⌊ y 2 m ⌋ ∗ 2 m + y m o d 2 m \left \lfloor \frac{y}{2^{m}} \right \rfloor*2^{m}+y\; mod \; 2^{m} 2my2m+ymod2m的形式。
这里需要证明一下 ⌊ x k 2 m ⌋ ∗ x + ⌊ ( x k m o d 2 m ) ∗ x 2 m ⌋ = ⌊ x k + 1 2 m ⌋ \left \lfloor \frac{x^{k}}{2^{m}} \right \rfloor*x+\left \lfloor \frac{(x^{k}\; mod\; 2^{m})*x}{2^{m}} \right \rfloor=\left \lfloor \frac{x^{k+1}}{2^{m}} \right \rfloor 2mxkx+2m(xkmod2m)x=2mxk+1
x k = a ∗ 2 m + b ( b < 2 m ) x^{k}=a*2^{m}+b\; (b< 2^{m}) xk=a2m+b(b<2m)
于是等式左边 = a x + ⌊ b x 2 m ⌋ =ax+\left \lfloor \frac{bx}{2^{m}} \right \rfloor =ax+2mbx
等式右边 = ⌊ x k ∗ x 2 m ⌋ = ⌊ a x ∗ 2 m + b x 2 m ⌋ = a x + ⌊ b x 2 m ⌋ =\left \lfloor \frac{x^{k}*x}{2^{m}} \right \rfloor=\left \lfloor \frac{ax*2^{m}+bx}{2^{m}} \right \rfloor=ax+\left \lfloor \frac{bx}{2^{m}} \right \rfloor =2mxkx=2max2m+bx=ax+2mbx
等式左右相等,即证。

/*
User:Small
Language:C++
Problem No.:3811
*/
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define inf 999999999
using namespace std;
const int M=1e5+5;
int n,q;
ull a[M],b[65];
void solve1(){ull res=0;for(int i=1;i<=n;i++) res|=a[i];printf("%llu",res>>1);if(res&1) printf(".5");printf("\n");
}
void solve2(){ull ans=0,res=0;for(int i=32;i>=0;i--){for(int j=32;j>=0;j--){bool flag=0;for(int k=1;k<=n;k++)if(a[k]>>i&1){flag=1;break;}if(!flag) continue;flag=0;for(int k=1;k<=n;k++)if(a[k]>>j&1){flag=1;break;}if(!flag) continue;flag=0;for(int k=1;k<=n;k++)if((a[k]>>i&1)!=(a[k]>>j&1)){flag=1;break;}if(i+j-1-flag<0) res++;//只有 (i,j)=(0,0)或(0,1)时有可能出现这种情况,//(i,j)=(0,0)时flag一定为0,因此对答案的影响是(1/2)*(2^0)=1/2;//(i,j)=(0,1)且flag=1时,对答案的影响是(1/4)*(2^1)=1/2。//因此出现这种情况时答案加1/2 else ans+=1LL<<(i+j-1-flag);//flag=0,则为1/2,flag=1,则为1/4 }}ans+=res>>1;printf("%llu",ans);if(res&1) printf(".5");printf("\n");
}
void solve3(){vector<ull> g;int cnt=0;for(int i=1;i<=n;i++){for(int j=22;j>=0;j--){if(a[i]>>j&1){if(b[j]) a[i]^=b[j];else{b[j]=a[i];cnt++;g.push_back(a[i]);break;}}}}ull ans=0,res=0;for(int i=0;i<(1<<cnt);i++){ull val=0;for(int j=0;j<cnt;j++) if(i>>j&1) val^=g[j];ull a=0,b=1;for(int j=0;j<q;j++){a*=val,b*=val;a+=b>>cnt,b&=(1<<cnt)-1;//对b取模 }ans+=a,res+=b;ans+=res>>cnt,res&=(1<<cnt)-1;}printf("%llu",ans);if(res) printf(".5");printf("\n");
}
int main(){freopen("data.in","r",stdin);//scanf("%d%d",&n,&q);for(int i=1;i<=n;i++) scanf("%llu",&a[i]);if(q==1) solve1();else if(q==2) solve2();else solve3();return 0;
}

这篇关于[BZOJ 3811]玛里苟斯:线性基(详细证明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591762

相关文章

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数