这是一篇对 cxy 2025 年同标题集训队论文的分析。该分析会较论文更多地从线性代数角度出发,需要读者有较好的线性代数认识。
前三章的内容极为经典,从第四章正交线性基开始难度略增,建议读者从头阅读。
基础线性基
考虑在 上定义向量,此时向量加法等价于大整数异或。对于给出的向量组 ,我们希望求出该向量组张成空间()的一个线性基,同时该线性基满足每个向量首个非零元素的位置递减。
求解任意线性空间的线性基可以利用高斯消元做到 时间复杂度,但是异或空间可以做到更优。
等价向量组的增量构造
在线性代数中,两个向量组等价当且仅当张成的空间相同,对于给定的向量组 ,和 ,我们从 中删去 ,同时加入 ,得到的新向量组 和 等价()。证明考虑原向量组的线性组合,由于向量中的元素全部在 上,因此在线性组合中的系数只需考虑 和 ,对线性组合是否包含 分类讨论即可。
接下来给出等价向量组的增量构造。需要构造 ,使得 内的零向量只出现在一段后缀,且非零向量的最高非零位严格递减。假设已经构造出了 ,考虑加入 ,记录指针 ,初始令 ,进行讨论,在 时结束:
这个过程显然是正确的。考虑最后得到的向量组形如一段非零前缀加上一段全零后缀,此时从极长非零前缀中任取一段子序列,得到的异或和都不相同。不难发现此时这段非零前缀就是原序列的一个线性基,设全零后缀中有 个零向量,则任取 中子序列的任意一种异或结果都为零向量。也就是说,原向量组的异或和组成的可重集就是极长非零前缀异或和组成的不可重集复制 得到的结果。
线性基的增量构造
上面的过程实际上已经构造出了一个原向量组的线性基(极长非零前缀),时间复杂度为 ,其中 为向量维数,额外空间开销为 。
线性基求向量组的最大线性表示
换句话说,就是对于原向量组,找出一个子序列使得异或和最大。
存在简单的贪心过程,考虑线性基 (线性基, 上存的是最高位为 的向量),从高到低贪心,从 和 中选取较优的一个即可,时间复杂度 。
线性基求某个向量被向量组线性表示的方案数
根据上文等价向量组增量构造部分中描述的结论,一个向量被原向量组线性表出的方案数为 或 (线性无关组表出向量的方式唯一)。为 当且仅当该向量能被线性基线性表出。根据线性代数的经典结论,一个向量能被某个线性无关向量组线性表出当切仅当加入该向量后仍然线性无关,即尝试将该向量插入向量组即可判断能否被线性基线性表出。
线性基求结果小于某个定值的线性表示数量
该问题和求线性基第 小线性表示等强。依然是在线性基上贪心,高位向低位贪心的过程中总是尝试将维护的值和给出的定值变得尽量相等。
线性基解决无向图上最大异或和路径问题
来源:WC2011 最大 XOR 和路径。
给出一张 个点 条边的无向图,找到一条 的路径(无需简单),使其异或和最大。
考虑一条路径走两次显然不会对答案产生任何影响,因此找到任意一条 的路径,设异或和为 ,存在某一个回路异或和为 ,我们总可以将该回路加入到路径中,即总能选出异或和为 的路径,从该路径上的任意一点走到回路再走回来即可。
任取 的路径,设权值为 ,构造每个回路的异或和张成空间的线性基,答案即为 异或线性基能得到的最大值。
设根据此方法得到的答案为 ,真实答案为 , 显然。考虑证明 ,设有一条取到 的最优路径,则我们先走最优路径到 ,再沿着得到 的路径倒着走回 ,再走回 ,前两者是一个回路,因此会被考虑到。
问题此时转化为求所有回路异或和张成空间的线性基,任意求出原图的一棵生成树 ,考虑一条非树边 ,只考虑所有形如 加上 简单路径这样形态的回路即可。
证明考虑按照该方法得到的线性基 ,及原基 。设原图的一条边为 ,代表 ,边权为 ,将这条边刻画成异或上 , 为在树上任取一个根 , 到根的异或和。对于原图的一个回路,考虑树上每个点 , 一定会被计入偶数次,因此对最终异或和没有造成贡献。
常见优化技巧
线性基合并
对两个向量组,对其合并后的向量组求线性基。这个线性基显然和等价向量组拼起来后得到的线性基一样,去掉所有 以后就是将两个原向量组的线性基拼起来,做上面求等价序列的步骤即可求出线性基。时间复杂度 。
结合数据结构
单点修改,查询区间线性基信息。
将线性基看成一种满足结合律的信息,这样可以用线段树等数据结构维护,时间复杂度 。
利用下文的知识可以对该复杂度进行优化。
维护等价向量组优化复杂度
对于原向量组的一些修改可能并不会很简单地转化成线性基上的修改,但是如果选择维护等价向量组,那么有时候会简化问题。
区间异或,查询区间线性基信息。
构造 。那么对于原任意一个区间 ,等价向量组是 ,此时对 的区间异或就转化成了对 单点异或,区间查询线性基信息和对 区间异或,查询单点线性基信息。按照上面结合数据结构的方法即可维护。
区间对下标在模 意义下和 相同的数异或,查询区间线性基信息。。
类似的,构造 ,此时就是和上文几乎完全一样的问题,可以做到类似复杂度。
前缀线性基
考虑原向量组关于线性基的增量构造法,不难发现如果只保留被加入时间不晚于 的所有向量,就能得到一段前缀的线性基。
动态维护二元组 (只有插入操作),将 视为优先级,求出将所有二元组按照优先级排序后依次将 插入得到的线性基。
考虑插入操作,当每次构造线性基时,我们都倾向于将优先级较高的二元组留下,将优先级较低的二元组做异或后进行以后的构造。不难发现该做法等价于题中所说的按照二元组优先级排序后得到的线性基。
CF1100F:多次查询区间线性基信息。
我们希望得到时间复杂度为 的做法。不妨将所有询问离线,扫描每一个数,类似上面一样将二元组 插入线性基。这样不难做到 。
SCOI2016 幸运数字:多次查询树上路径线性基信息。
不妨先考虑查询的两个端点存在祖先后代关系时的做法。对于树 dfs,利用前面的技巧保留从根开始一条链上的线性基即可。对于一条路径,无非就是将两个线性基进行合并。时间复杂度 。
动态线性基,包含插入、删除。
离线下来,类似线段树分治,只不过这里只需要将二元组 插入即可,其中 是被删除时间,时间复杂度 。
上述算法只能离线处理,同时导致无法进一步在扩展问题上利用控制优先级这一做法。存在较大缺陷。
线性基的进一步消元
类似线性代数中矩阵这一板块中的简化行阶梯型矩阵,若将线性基中的每个向量放到每行上,上文中得到的线性基是行阶梯型矩阵。实际上向量组线性基的构造过程就可以用 上的高斯消元来刻画。考虑进一步将其变成简化行阶梯型矩阵。即若 ,则对于所有其余的 , 的第 位为 。
存在简单的算法来实现这个过程,从低位向高位考虑即可,数学归纳法不难证明。这种进一步消元有些时候存在很大的帮助。
集训队互测 2023~2024:Xor Master.
考虑对于一个数怎么求 ,对 的线性基做进一步消元,这样若 ,则要求选中 。但是这个过程无法很好地和 进行复合,考虑令 ,则求 是类似的——若 ,则要求选中 ,但是 就可以很方便地和 复合了。我们有 。证明可以对于每个 分别考虑。
考虑 和 的关系,根据上文不难发现 。因此对于原问题()就可以刻画成 ,其中 。我们维护 。
考虑一种暴力的做法,当修改 的时候 求出 ;当修改 的时候暴力重构(该部分时间复杂度 )。此时所有的修改和询问利用 uoj671 的套路 可以在 的时间复杂度内解决。
观察到重构的复杂度实际不必是 ,在每次线性基扩大后对其做进一步消元。这样的话我们只需要对线性基中改变的那个 进行抉择即可,这样重构的时间复杂度是 。利用上面回答修改和询问的做法可以做到 。
前缀线性基结合数据结构
维护 个向量组,每次向向量组中插入一个向量,或者查询区间所有向量组组成的线性基信息。
利用上文线性基结合数据结构的方法,直接线段树维护线性基信息可以做到 。结合上前缀线性基,我们可以做到更优。考虑查询区间第一次在线段树上被切开,此时一定是包含一个左儿子的后缀和一个右儿子的前缀。我们对于左儿子维护后缀线性基信息,对于右儿子维护前缀线性基信息,这样查询的复杂度可以做到 。修改时对于根到叶子上所有的节点做一次带优先级的线性基插入即可。时间复杂度 。
若将操作改为修改向量组中的某个向量,则需要解决“单点修改,查询任意前缀线性基的信息”,该问题目前没有很好的做法。
正交线性基
回顾线性代数上向量标准内积以及向量正交的定义。对于 上的 维列向量 和 ,定义其标准内积 ,其中 代表共轭复数。两个向量正交当且仅当其标准内积为 。
由于本文中所有的向量定义在 (大小为 的有限域)上,因此可以忽略取共轭复数这一步骤。进而可以给出两个向量正交更为简洁的定义:,不难发现该定义在 上等价于一般线性代数中正交的定义。我们将上述运算称为 和 的点乘,记作 。
对于向量组 ,对其定义长度为 的点值序列 ,其中 代表 中的向量任意线性组合得到 的方案数。两个点值序列的异或卷积 结果也是一个点值序列 ,定义上为 原序列拼接起来后得到的点值序列,形式上可以写为 。
对于点值序列,定义其 变换为 。
根据上文对异或卷积的定义,不难得到 ,其中这里的 代表异或卷积,下文也是如此。同时点乘和异或满足结合律:。证明考虑拆位。
同时,对点值序列 连续做两次 变换后得到的是 ,以及对于两个点值序列异或卷积的结果 ,有 , 代表逐点相乘。第一个结论的证明可以看 此处。第二个结论的证明大致类似。
点值序列做 FWT 后的结果
考察 的点值序列 做 FWT 后的第 项 的值。根据上文,有 ,进而得到 ,后者等于 ,因此若 和 的所有元素正交,则 ,否则 。
上文指出点值序列连续做两次 FWT 后等价于将每个元素乘上 ,因此若能求出 ,同时对其做一遍 FWT,然后将每个元素除以 就能得到原来的点值序列。而求 只需将某些位置设为 即可。现在我们关注如何判定 和 中的每一个元素是否正交,根据点乘和异或的分配性,得到 且 充要于 且 。因此只需判定 和 的任意等价序列是否正交即可。
这个转化将问题重新回到了线性基上,同时,某些情况下与线性基所有元素正交的 非常少。例如对于满正交基做进一步消元后,不难发现与该线性基正交的只有 。
CF1336E2:给定长为 ,值域为 的序列 ,求有多少子序列异或和的 。,。
这个问题只需要研究对应的线性基,若线性基内非零元素的数量不超过 个,此时可以直接枚举其所有异或结果。
对于非零元素较多的情况,利用上面关于点值序列做 的分析,只需要求出将所有与线性基正交的位置赋成 ( 为线性基内非零元素数),做一次 后除以 即可。如果令 代表与线性基正交,且 为 的有 个,那么已经可以得到答案。
令 代表 时的答案,考虑某一个 对 的贡献。假设 ,如果和一个这 个位置上有 个位置为 ,其余 个位置上有 个位置为 的 做 ,此时贡献对 的贡献为 ,利用组合数学基础知识不难得到总贡献为 ,结合上 可以在 时间内解决问题。
因此现在的唯一问题就是求 ,该问题会在下文的正交线性基中得到解决。
正交线性基的构造
先对线性基做进一步消元,接下来,对于每种将 的位置 填上 或 的 种方案,都有唯一的将 填上 或 的方案使得最终得到的向量和线性基正交。
这放在进一步消元过后的线性基上时容易看出的。考虑进一步刻画这件事情,从低到高进行考虑,若 ,且我们在第 位上选择 ,那么对于 的 ,若 包含 ,那么最终 第 位上的结果就会进行反转。
我们构造一个新序列 ,其中若 ,则 ,否则 ,即上文的刻画用 表示出来。如果对于某个 要在第 位上选择 ,则最终的 需要异或上 。
被称为原线性基的正交线性基,其所有子序列异或和构成的集合恰好为 的集合,其中 与线性基正交。构造正交线性基的时间复杂度为 ,同时注意构造前需要对线性基进行进一步消元。
回到上面的题目,此时我们只需要求出正交线性基,同时枚举所有非零元素的子集求出所有 即可得到 。不难发现正交线性基所有子集异或结果的集合大小为 ,结合上面 的做法可以做到 的时间复杂度。
同时,不难看出正交线性基是一个线性无关组,证明考虑任取两个不交的子集,最低位一定只在其中一个的异或和出现。
线性基求交
给出若干线性空间的线性基,需要求出这些线性空间的交的线性基。首先给出结论:答案线性基等价于原先所有线性基正交后求并再正交回来的线性基。
设这些线性空间为 ,考虑另一个问题, 是否在所有线性空间中都存在。这等价于所有线性空间的点值序列做点乘以后第 项是否为 。由于若干个向量组做异或卷积后进行 等价于分别做 后点乘,点乘往往转化成 结合异或卷积的形式。写出形式 ,令 ,则 。观察点值序列 ,这等价于 的正交线性基拼上 个 后得到的点值序列。由于点值序列的异或卷积等价于将序列拼起来以后的点值序列,因此我们只关注所有正交线性基拼起来以后再求正交线性基后是否存在子集异或和为 。
候选队互测2022:枪打出头鸟。
暂时略去。
带删线性基
具有缺陷的实现方法
支持插入删除带优先级的元素,查询一段优先级前缀的线性基大小。。
之前在不带优先级的类似题目中使用了带优先级的线性基离线解决了该问题(第三章),但是该方法已经消耗掉了线性基内可供我们支配的自由元,因此无法在该做法上进一步优化来解决带优先级的问题。如果将优先级扩展到二维,此时就会是一个左上角的矩形查询,无法将其刻画成前缀线性基需要的前缀形式。
首先考虑线性基和原向量组的关系。线性基并不存在和原向量组中某个向量的一一对应关系,而是线性基中的某个向量是原向量组的线性组合,同时这样的线性组合方式显然不唯一。考虑上文中线性基的增量构造方法,将成功加入线性基的向量集合称为标准基。标准基的大小和线性基同阶,同时有了标准基之后也可以得到线性基。对于所有关于权值、优先级的二元组按照插入的顺序重新标号,将插入操作视为将二元组的权值修改为指定向量,删除操作视为将权值修改为零向量。记录 状压 这个向量被标准基哪些元素线性组合得到, 状压线性基中的 这个向量被标准基哪些元素线性组合得到。
一个常见的问题是上述状压均需要标准基本身线性无关,证明详见 此处。
考虑删除操作,若二元组不在标准基内是简单的,直接删除即可。否则删除过后标准基一定会发生变化,设删除的二元组为 ,前者为向量,后者为优先级。首先在标准基内删除 ,然后加入一个最小的 ,使得 包含 ,将其加入标准基。不妨考虑线性基的增量构造过程,不难发现该结论是正确的。
考察此时 和 的变化。首先需要明确, 只包含 ,当且仅当 在标准基内。令 (即将 的第 位变成 之后得到的结果),将所有包含 的 和 异或上 。因为此时的 可以被等价替换为 。
思考线性基的 现在应该做出如何变化(我们不能在询问时根据标准基重建线性基,这样的时间代价过大)。我们实际上不必恪守必须保持线性基和增量构造时的形态一样这一准则,只需其可以通过标准基元素线性组合得到这一条件即可。删除 后 显然满足该条件,因此无需对线性基形态做出修改。
回到上面寻找 的步骤,若此时找不到 ,标准基显然不会发生任何变化,同时 也不会发生任何变化。只需要考虑 和 的变化即可。找到最小的 使得 包含 (显然,一定可以找到),然后对于所有的 ,若其包含 ,则异或上 ,对 做同样处理,最后将 和 相应归零。先考虑此时线性基内的变化,线性基内的 依然可以写成标准基的线性组合。对于 来说,根据标准基本身线性无关,因此不难发现该变化是合理的。对 归零这一步操作的正确性可以通过对此时 的变化分析得到。
我们在做任何操作中秉持的原则是标准基本身和增量构造得到的形态一样,线性基保证是标准基的线性组合得到(同时若 存在,则必须体现 )。根据这些原则其余额外保持的一些性质都可以通过标准基本身线性无关推出,例如前缀线性基中所谓的优先级问题,当我们能维护出一个正确的标准基,该问题就迎刃而解了。
考虑插入操作。将此时的 写成标准基子集异或和的形式(利用 )。那么若包含一个 使得 ,此时就应该在标准基中删去 ,加入 ,该部分影响和删除操作类似。
上述所有操作的总时间复杂度为 , 为字长,由于带有 这个因子,因此该复杂度在大多数问题中都是不可接受的。同时该线性基还有一个严重的缺陷,原问题只需要提供线性基的大小信息,而对于查询全部的线性基信息(例如最大线性表出)这种问题无能为力,因为即使有一个固定的标准基,与之对应的仅仅是一个线性基有固定的标准基线性表示而非线性基是固定的,线性基必须存在很强的限制才能使其固定,因此对于同一个标准基,存在多种线性基,上文所有的维护操作只保证了维护的是其中某一种线性基,同时在“大小”这一属性上具有完全前缀性(成功维护了所有使得线性基成功扩张的位置),而在其它方面(形态等)并未具有完全前缀性。当然,该线性基对于非前缀查询而是全局查询的问题还是可以轻松解决的。
结合数据结构
单点修改,查询区间线性基信息。,。
这个问题在上文已经可以做到 的时间复杂度,利用前缀线性基可以在保证每次修改的是 的情况下做到 ,利用本章的带删线性基可以给出朴素情况下 的做法。
一个直接的想法是类似上文的 做法,维护线段树上每个区间的标准基信息,然后在 的时间内重建前后缀线性基,进而得到区间的线性基信息。目前我们所知的带删线性基复杂度带有 这个因子,问题在于需要维护标准基线性组合来维护标准基的变化,而在线段树这种分治结构上,自然可以利用信息合并来完成。
后面还没看懂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现