[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

相关文章

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行

自研四振子全向增益天线! 中兴问天BE6800Pro+路由器拆机和详细评测

《自研四振子全向增益天线!中兴问天BE6800Pro+路由器拆机和详细评测》中兴问天BE6800Pro+路由器已经上市,新品配备自研四振子全向增益天线,售价399元,国补到手339.15元,下面我们... 中兴问天BE6800Pro+路由器自上市以来,凭借其“旗舰性能,中端价格”的定位,以及搭载三颗自研芯片

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

将图片导入Python的turtle库的详细过程

《将图片导入Python的turtle库的详细过程》在Python编程的世界里,turtle库以其简单易用、图形化交互的特点,深受初学者喜爱,随着项目的复杂度增加,仅仅依靠线条和颜色来绘制图形可能已经... 目录开篇引言正文剖析1. 理解基础:Turtle库的工作原理2. 图片格式与支持3. 实现步骤详解第

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启