常见算法题型之数论进阶:线性基
常见算法题型之数论进阶线性基线性基是算法竞赛中专门处理子集异或和问题的核心数据结构它通过构造一组线性无关的基底将原集合所有可能的异或组合压缩到与二进制位数同级的空间中能在O(log⁡V)O(\log V)O(logV)的时间内完成各类查询是处理异或问题的必备工具。一、基础概念与性质1. 异或运算核心性质线性基的所有操作都基于异或的基本性质交换律a⊕bb⊕aa \oplus b b \oplus aa⊕bb⊕a结合律(a⊕b)⊕ca⊕(b⊕c)(a \oplus b) \oplus c a \oplus (b \oplus c)(a⊕b)⊕ca⊕(b⊕c)自反性a⊕a0a \oplus a 0a⊕a0a⊕0aa \oplus 0 aa⊕0a关键推论若a⊕bca \oplus b ca⊕bc则等价于ab⊕ca b \oplus cab⊕c、ba⊕cb a \oplus cba⊕c2. 线性基的定义对于一个非负整数集合它的线性基BBB是满足以下条件的特殊数集张成性原集合的任意一个子集的异或和都可以由BBB中若干个数异或得到线性无关性BBB的任意非空子集的异或和都不为 0即没有冗余元素规范性BBB中第jjj个元素若存在的二进制最高位为第jjj位且其他元素的第jjj位均为 0。3. 核心性质线性基的大小不超过数值的二进制位数int范围最多 32 个long long最多 64 个线性基不唯一但基底数量固定能表示的异或和集合完全一致线性基本身无法直接表示 0若原集合存在非空子集异或和为 0插入过程中会出现数值被消为 0 的情况。二、线性基的构造插入操作1. 构造原理逐个将原集合的数插入线性基从最高位向最低位处理若当前位已有基底则用基底消去当前数的这一位直到数变为 0可被已有基底表示或找到空位完成插入。2. 分步插入流程设线性基数组为b[]b[j]表示最高位为第jjj位的基底当前插入数为xxx从最高位如 31 位到 0 位倒序遍历二进制位若xxx的第jjj位为 0直接跳过若b[j]为空值为 0则令b[j] x插入成功结束流程若b[j]已存在则令x ^ b[j]消去xxx的第jjj位继续循环若最终xxx变为 0说明该数可被已有线性基表示插入失败。3. 插入代码片段int 版intb[32];// 存储线性基b[j]对应最高位为j的基底// 向线性基插入一个数xvoidinsert(intx){for(intj31;j0;j--){if((xj)1){// 当前位为1if(!b[j]){// 该位无基底直接插入b[j]x;break;}x^b[j];// 用基底消去当前位}}// 若x最终为0说明原集合可异或出0}三、核心查询操作1. 判定数值能否被表示用途判断一个数valvalval是否等于原集合某个子集的异或和。方法模拟插入过程用valvalval逐位消去基底若最终结果为 0 则可以表示否则不能。boolcheck(intval){for(intj31;j0;j--){if((valj)1){if(!b[j])returnfalse;// 无对应基底无法表示val^b[j];}}returnval0;}2. 求最大异或和用途求原集合所有子集异或和的最大值。方法贪心思想从高位到低位遍历若异或当前基底后结果变大则选择该基底。intquery_max(){intres0;for(intj31;j0;j--){if(b[j](res^b[j])res){res^b[j];}}returnres;}3. 求最小非零异或和用途求原集合所有非空子集异或和的最小值。方法线性基中最低位的非零基底就是答案。intquery_min(){for(intj0;j31;j){if(b[j])returnb[j];}return0;// 空集情况根据题意调整}4. 补充能否异或出 0线性基本身不能表示 0需额外标记若插入过程中任意一个数被消为 0则原集合存在非空子集异或和为 0。四、模板例题精讲题目链接https://ac.nowcoder.com/acm/problem/179681. 题意重述给定nnn个数QQQ次询问每次给出 (x,y)问能否选择若干个数与xxx异或任意多次最终得到yyy。2. 思路转化根据异或自反性题目等价于是否存在子集SSS满足x⊕(S的异或和)yx \oplus (\text{S的异或和}) yx⊕(S的异或和)y两边同时异或xxx得到S的异或和x⊕y\text{S的异或和} x \oplus yS的异或和x⊕y问题直接转化为判断x⊕yx \oplus yx⊕y能否被原集合的子集异或表示这正是线性基的基础查询场景。3. 代码详解对应你提供的标准正解代码核心逻辑拆解如下#includebits/stdc.husingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(0);intn,q;cinn;vectorinta(n);for(inti0;in;i)cina[i];vectorintb(32);// 线性基主体// w、id数组用于记录构造方案本题不需要输出方案可忽略vectorintw(32),id(32);// 构造线性基for(inti0;in;i){intxa[i],tmp0;for(intj31;j0;j--){if((xj)1){if(!b[j]){b[j]x;id[j]i;w[j]tmp^(1j);break;}x^b[j];tmp^w[j];}}}cinq;while(q--){intx,y;cinxy;inttagx^y;// 核心转化判断tag能否被表示if(!tag){// tag为0无需选数直接成立coutYES\n;continue;}boolfailfalse;inttmp0;for(intj31;j0;j--){if((tagj)1){if(!b[j]){// 无对应基底无法表示failtrue;break;}tag^b[j];tmp^w[j];}}if(fail)coutNO\n;elsecoutYES\n;}return0;}4. 复杂度分析构造线性基O(n×log⁡V)O(n \times \log V)O(n×logV)VVV为数值最大值int 下log⁡V32\log V 32logV32单次查询O(log⁡V)O(\log V)O(logV)总复杂度O((nQ)log⁡V)O((nQ)\log V)O((nQ)logV)在n,Q≤105n,Q \le 10^5n,Q≤105的数据下完全满足时限要求。五、完整通用模板long long 版覆盖绝大多数线性基题型可直接复用#includebits/stdc.husingnamespacestd;typedeflonglongll;constintMAX_BIT63;// long long 范围 0~62位ll basis[MAX_BIT];boolhas_zero;// 是否能异或出0// 插入数xvoidinsert(ll x){for(intiMAX_BIT-1;i0;i--){if((xi)1){if(!basis[i]){basis[i]x;return;}x^basis[i];}}has_zerotrue;// x被消为0可异或出0}// 判断x能否被表示boolcheck(ll x){for(intiMAX_BIT-1;i0;i--){if((xi)1){if(!basis[i])returnfalse;x^basis[i];}}returntrue;}// 查询最大异或和llquery_max(){ll res0;for(intiMAX_BIT-1;i0;i--){if(basis[i](res^basis[i])res){res^basis[i];}}returnres;}// 查询最小非零异或和llquery_min(){if(has_zero)return0;for(inti0;iMAX_BIT;i){if(basis[i])returnbasis[i];}return0;}六、常见应用场景子集异或和的存在性、最值、第k小问题树上路径异或和结合前缀异或转化为两点异或博弈论中的 Nim 游戏变种、公平组合游戏集合异或合并、带删除的线性基离线处理等进阶问题。

相关新闻

Iwara下载工具终极指南:3种方法轻松批量下载Iwara视频

Iwara下载工具终极指南:3种方法轻松批量下载Iwara视频

Iwara下载工具终极指南:3种方法轻松批量下载Iwara视频 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 想要保存Iwara平台上的精彩视频内容吗?寻找一款高…

2026/9/24 2:56:22 阅读更多 →
7个步骤掌握NVIDIA驱动隐藏参数调校:深度解析NVIDIA Profile Inspector

7个步骤掌握NVIDIA驱动隐藏参数调校:深度解析NVIDIA Profile Inspector

7个步骤掌握NVIDIA驱动隐藏参数调校:深度解析NVIDIA Profile Inspector 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业级显卡优化工具,专为…

2026/9/24 2:59:18 阅读更多 →
Python+Django构建高效网吧会员管理系统实战

Python+Django构建高效网吧会员管理系统实战

1. 网吧管理系统项目概述 网吧会员上机管理系统是典型的B/S架构商业应用,采用PythonDjango技术栈开发(项目代号eas18u43)。这个系统要解决的核心痛点是传统网吧手工登记方式的低效与混乱——我记得2010年在北京某网吧亲眼见过前台用三个Excel…

2026/9/19 12:06:39 阅读更多 →

最新新闻

Apache Arrow GLib(C)深入指南:基于 GObject 的 C++ 封装、GObject Introspection 与多语言实战

Apache Arrow GLib(C)深入指南:基于 GObject 的 C++ 封装、GObject Introspection 与多语言实战

数据工程大数据序列化数据分析 【免费下载链接】arrow Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing 项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow 点击查看 免费下载 Apache Arrow GLib 是 …

2026/9/24 3:00:16 阅读更多 →
基于TinyUSB的STM32 U盘实现:从RAM Disk到SPI Flash完整教程

基于TinyUSB的STM32 U盘实现:从RAM Disk到SPI Flash完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:00:16 阅读更多 →
Flyway数据库迁移实战:从MySQL到达梦的生产级落地指南

Flyway数据库迁移实战:从MySQL到达梦的生产级落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 2:59:15 阅读更多 →
Win11 忘记本地账户密码,无需旧密码快速重置(PowerShell 命令行方案)

Win11 忘记本地账户密码,无需旧密码快速重置(PowerShell 命令行方案)

Win11 忘记本地账户密码,无需旧密码快速重置(PowerShell 命令行方案) 📌适用范围:Windows11 本地账户,已经可以进入系统(能进桌面、可打开管理员终端);不适合微软账户登录,也不适合完全卡在登录界面无法进系统的场景。 一、问题场景 日常使用 Win11 时,很多人会遇…

2026/9/24 2:59:15 阅读更多 →
Kornia RandomTransplantation 的 MPS 后端空轴过滤 Bug 修复解析(4160)

Kornia RandomTransplantation 的 MPS 后端空轴过滤 Bug 修复解析(4160)

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 导读 本文围绕 Kornia 版本迁移记录 changelog.d/migrati…

2026/9/24 2:58:15 阅读更多 →
Mosquitto 1.4.2 版本剖析:Broker 与客户端库关键缺陷修复详解

Mosquitto 1.4.2 版本剖析:Broker 与客户端库关键缺陷修复详解

后端消息队列消息路由 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mos/mosquitto 点击查看 免费下载 Mosquitto 1.4.2 是 Eclipse Mosquitto 在 2015 年 5 月发布的一个纯缺陷修复&…

2026/9/24 2:58:15 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →