首页 > 其他分享 >线性基学习笔记

线性基学习笔记

时间:2024-09-07 15:27:37浏览次数:5  
标签:log 基的 笔记 学习 异或 子集 线性 我们

1.线性基的本质

线性基的本质就是空间上的一组向量可以用线性变换表示出所有向量。

OI 中常见的主要是异或线性基,就是用若干个数表示一组数的异或和的空间。

2. 异或线性基

2.1 插入

线性基的构建本质上类似高斯消元。

我们设 \(b_i\) 表示主元是 \(i\) 的数,对于一个线性基加入一个数 \(x\),我们从高到低遍历,假设当前是 \(j\):

  1. 如果 \(b_j\) 暂时没有,我们就让 \(b_j=x\) 并终止。

  2. 如果有,我们就让 \(b_j \oplus x \to x\),然后继续。

我们发现,这样构建完后线性基大小是 \(O(\log V)\) 的,并且 \(b_i\) 的前 \(i\) 位都是 \(0\)。

其实就是一个上三角的矩阵。

for (int j = 50; j >= 0; j--)
	if ((x >> j) & 1)
		if (b[j])  //主元确定
			x ^= b[j];
		else {
			b[j] = x;
			break;
		}

2.2 消元

我们可以将一个线性基所有 \(b_j\) 存在的位置视作变量,剩下的位置都是值。

那么我们现在 \(b_j\) 其实是若干个变量,我们希望每个 \(b_j\) 只有一个变量。

为了方便后续操作,我们从低到高位消元,使得每个 \(b_j\) 的变量只有一个。

for (int i = 0; i <= 50; i++)
	for (int j = i + 1; j <= 50; j++)
		if ((b[j] >> i) & 1)
			b[j] ^= b[i];

2.3 应用

P3812 【模板】线性基

求最大异或和,我们建出线性基并且消元,我们发现答案就是所有线性基中数的异或和。

提交记录

LOJ114 k 大异或和

我们发现更高位的线性基对于更低位的是压倒性胜利,所以我们可以按照字典序的思路一位一位取。这个过程就相当于取走线性基中所有 \(K\) 二进制位下是 1 的数,注意如果不存在是不计入的。

提交记录

P4869 albus就是要第一个出场

我们假设总共 \(n\) 个数,线性基中 \(k\) 个数,则每个异或值都出现了 \(2^{n-k}\) 次。

其实不难理解,所有不在线性基中的数都可以被其中的子集表示,那么每次相当于给 \([k]\) 的子集变成复制一份加上一份中每一个都和一个集合 \(S\) 异或一下,显然后面是一个一一映射,所以出现次数是相等的。

提交记录

P4151 [WC2011] 最大XOR和路径

神题。注意到如果我们走到一半跑去一个环玩一圈再回来,那么贡献只有环的异或值。所以我们只用找到所有环的异或和的线性基,在其中找到一个子集和 \(d_n\) 的异或最大即可。

找与某个数异或最大的子集很简单,每次判断选上当前的会不会更大即可。

提交记录

P3292 [SCOI2016] 幸运数字

我们用倍增维护线性基,然后查询时把 \(O(\log n)\) 个线性基合并即可。合并两个线性基的时间复杂度是 \(O(\log^V)\) 的,所以时间复杂度 \(O(n \log n \log V + q \log n \log^2 V)\)。

提交记录

标签:log,基的,笔记,学习,异或,子集,线性,我们
From: https://www.cnblogs.com/rlc202204/p/18401705

相关文章

  • 【内网渗透】最保姆级的春秋云镜Exchange打靶笔记
    目录flag1flag2flag3 flag4flag1fscan扫外网访问8000端口->官方网站 Java代码审计之华夏ERPCMSv2.3|Drunkbaby'sBlogadmin/123456弱口令打/user/list?search=的jdbc+fj反序列化vps搭一个MySQL_Fake_Serverpayload:/user/list?search=%7b%20%22%6e%6......
  • prometheus学习笔记之kube-state-metrics
    一、kube-state-metrics简介Kube-state-metrics:通过监听APIServer生成有关资源对象的状态指标,比如Deployment、Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以我们可以使用Prometheus来抓取这些数据然后存储,......
  • 【Java 学习】:抽象类&接口
    ✨                         人逢喜事精神爽,月到中秋分外明    ......
  • 语言学习有捷径?没错!这4个方法让你轻松搞定英语翻译
    现在全世界都在用英语,这门语言真的超级重要。不管你是学习、上班还是出去玩,会点英语翻译肯定能帮上大忙。但是,对很多人来说,翻译英语还是挺难的。别急,今天我就来给你介绍几个超好用的英语翻译工具,让你翻译英语变得轻松又简单。一、福昕在线翻译瞬移✚ https://fanyi.pdf365.......
  • 告别单调,Xmind思维导图之后还有这三款神器,让学习工作更愉快
    这年头信息量爆炸,我们得想办法把事情想清楚、把活儿排排好、学点新玩意儿。思维导图这东西,因为它画出来一目了然,用起来也简单,所以特别受学生们和上班的人的欢迎。在这么多画思维导图的软件里,Xmind因为功能全、界面不复杂,挺招人喜欢的。不过,除了Xmind思维导图,还有几个软件也挺好......
  • opencv-python学习笔记2-opencv基本操作
    目录 一、opencv架构:(1)OpenCV的主要模块包括:(2)OpenCV的架构特点:(3)OpenCV的应用场景:二、图像输入输出模块imgcodecs: a.imread:b. imwrite:三、opencv界面编程:(1)创建窗口:(2)显示图像:(3)添加滑块:(4)处理鼠标事件:(5)等待用户输入(6)销毁窗口四、单窗口显示多图片:(1)np.hstack()......
  • 可以学习的进销存软件
    ......
  • 浙大数据结构:02-线性结构4 Pop Sequence
    这道题我们采用数组来模拟堆栈和队列。简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop1、条件准备stk是栈,que是队列。tt指向的是栈中下标,front指向队头,rear指向队尾。初始化栈顶为0,队头为0,队尾为-1#include<iostream>usingn......
  • react 学习之从diff children看key的合理使用
    大部分优化环节react都自己在内部处理了,但有一种情况也值得开发者注意,那就是列表中key的使用,合理的使用key有助于能精确的找到用于新旧节点复用的老节点。那么我们这里来学习下react是如何diffchildren的,从源码的角度看。用几个案例来描述ReactdiffChild核心流程,react在一次更......
  • FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
    ​很多程序员想学习音视频的编程开发,却不知从何学习,因为音视频技术的体系庞大、知识杂糅,一眼望去就令人生怯。那么学习音视频建议站在前人的肩膀上,从优秀的音视频开源框架开始钻研,先熟悉这些开源工具的具体用法,再深入了解这些开源框架的实现代码。有鉴于此,博主整理了几个流行的......