首页 > 其他分享 >[BZOJ3811] 玛里苟斯 题解

[BZOJ3811] 玛里苟斯 题解

时间:2024-12-14 17:53:08浏览次数:11  
标签:12 frac int 题解 复杂度 苟斯 异或 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)\)。

实际上,根据 \(k=1,2\) 的情况,容易证明 \(\{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;
}

标签:12,frac,int,题解,复杂度,苟斯,异或,BZOJ3811
From: https://www.cnblogs.com/chang-an-22-lyh/p/18606995/bzoj3811-ma_li_go_si-tj

相关文章

  • 机载电脑通过TypeC连接Pixhawk 6c (PX4)后的状态确认及问题解决
    在三个终端依次运行命令查看连接状态roscoeroslaunchmavrospx4.launchrostopicecho/mavros/state1.运行mavrospx4.lauch时udp1报错“networkisunreachable”原因:网关未设置解决方法:先通过使用route命令查看默认ip,发现网关未设置,再通过以下命令设置网关:sudorout......
  • 【决策单调性】P3648 [APIO2014] 序列分割 题解
    题目链接:P3648[APIO2014]序列分割(注:由于本题解的状态转移方程需要用到\(k\),所以原题中的\(k\)对应本题解中的\(m\)。)给你一个长度为\(n\)的序列\(A_1,A_2,...,A_n\),一开始把它看作一个块。初始你的分数为\(0\),现在你需要进行下列操作恰好\(m\)次:选一个块,并从一处......
  • ARC132E题解
    简要题意有\(n\)个方块,每个方块有一个初始状态可能为左右或者空。每次操作随机选择一个空进行操作。每次操作可以向左或者向右走一直到下一个空或者走出边界,走到的每个格子会变成左或者右,这取决于移动方向。求无法操作时方格为左的期望数。数据范围:\(n\le10^5\)。题解首先......
  • 2024年12月GESPC++三级真题解析
    一、单选题(每题2分,共30分)题目123456789101112131415答案BDAADBCAADDCDCA1.下列二进制表示的十进制数值分别是()[10000011]原=()[10000011]补=()A.-125,-3B.-3,-125C.-3,-3D.-125,-125【答案】B【考纲知识点】原码和补码的计算及转换【......
  • P10370 「LAOI-4」Mex Tower (Hard ver.) 题解
    有一定难度的思维题。题目传送门思路首先,\(\operatorname{mex}(x,y)\)的结果一定为\(0,1,2\),因为只有两个数,所以结果最多为\(2\)(\(x=1,y=0\)或\(x=0,y=1\)时)。因此,可以将问题转化为最后的数是否为\(2\)。考虑倒推,当\(n=1\)时,显然只能为\(2\);要从\(n=2\)的情况变为......
  • P10433 [JOISC 2024 Day2] 棋盘游戏 题解
    Description有一个供\(K\)个玩家玩的棋盘游戏。该游戏的棋盘由\(N\)个编号从1到\(N\)的单元格和\(M\)条编号从1到\(M\)的路径组成,其中路径\(j\)(\(1≤j≤M\))双向连接着单元格\(U_j\)和\(V_j\)。棋盘上有两种类型的单元格:重新激活单元格和停止单元格。这些......
  • P8998 [CEOI2022] Prize 题解
    Description这是一道交互题。Tomislav在睡梦中想到了一个问题:给定两棵大小为\(N\)的树,树上的节点按\(1\simN\)分别编号,树则分别编号为树\(1\),树\(2\),树有边权,但是边权被隐藏了起来。Tomislav需要向交互库提供一个大小为\(K\)的编号的子集\(S\),在选择了这个集合后,小......
  • uniapp的uview2.0框架u--textarea组件(或uv-ui uv-textarea)(或uviewui u--textarea)无法
    问题描述在使用uniapp的uview2.0框架u–textarea组件时,想要使u–textarea支持换行输入,但是默认不支持换行输入,各种百度,没有找到解决问题的方案,最后只有查看源码如下但发现源码没有对属性有过多的处理,我开始怀疑是不是原生组件又问题,但是测试之后发现原生组件并没有问题,经过一天......
  • 【Adutodesk安装无法完成,错误103 问题解决】
    1、工具包 AutodeskInstaller下载:我用夸克网盘分享了「Autodesk103错误工具包」链接:https://pan.quark.cn/s/0889a02a12ec2、问题尝试安装Autodesk产品时,安装失败并显示以下错误:安装错误:[程序名称]安装无法完成。错误103 3、原因原因包括但不限于:(Autodesk大部......
  • 【秋招笔试-支持在线评测】11.13花子_海外版秋招(已改编)-三语言题解
    ......