学习心得 - 数学 - 线性代数入门(拟阵、异或空间线性基)
序
本文是一名绝望的初中生在学习贪心(骗你的这篇文章一半的篇幅都与编程没有太大的关系)的时候试图理解拟阵的随笔,可能表述不够专业与准确,见谅。我认为本文在没有学习过任何高中的数学知识之前还是比较好理解的,但是如果你已经有了高中的数学基础,可以跳过一些非必要的部分。
对于异或空间线性基,作者之前学过一点,但发现网上大部分资料对于其原理和意义的解释不是很容易懂,为了填坑所以写了这些内容,希望能对后人有所帮助吧。(线性基真心不建议看 OIwiki,前置数学知识太多且太杂了)
前置知识
在了解拟阵是什么之前,我们要了解一些基础的知识。这一部分可能被高中的线性代数知识严格包含,如果已有基础的读者可以选择性跳过。
向量与线性组合相关
首先我们需要一种元素来描述线性组合,这就是向量。向量的定义:有方向有大小的量(废话)。我们考虑在一个二维平面上,以原点为基准,任何点都可以用两个向量(竖直方向与水平方向) 来表示。我们称这些向量的组合为:线性组合。
之后我们再给出一个定义:线性相关。还是在二维平面上,此时 \((u,v)\) 这个二维向量有一个较为形象的理解就是 \((0,0)\) 为原点向右 \(u\) 个单位(可能为负),向上 \(v\) 个单位(也可能为负)移动(这里的向量不一定定义严谨,你可以理解成一个偏移值)。 那么此时我们有两个向量:\(a=(2,0)\) 和 \(b=(4,0)\),此时它们方向相同,且符合等式 \(b=2a\)。那么我们可以感性理解成 \(b\) 可以由两倍 \(a\) 代替,那么我们认为:\(a\) 和 \(b\) 线性相关,即这两个向量通过等比放大 / 缩小后等价。下文中可能会有两种向量的表示法,也就是 \((1,0)\) 与 \(\begin{pmatrix}1\\ 0\end{pmatrix}\),读者遇到时留意一下其含义是相同的。
反之,如果两个向量无论如何放缩,都无法等价,如 \(a=(1,0)\) 和 \(b=(0,1)\) 的方向不同,那么我们就称其线性无关。
给出了这些比较基础的定义之后,我们就可以进入线性基的范畴。这个算法我之前写过文章,但是没有系统了解过异或空间上的线性基,导致我只是非常感性的写了一下。这里简单提一嘴:这可以看作每一维度的 \(01\) 循环,一般是六十维,每次异或就是在里面选一点向量组合看看能不能计算出想要的结果。之后我们会具体介绍它。
基与维度相关
我们定义一组向量为基当且仅当:所有向量线性无关,且能够组合成该空间的全部向量。例如对于我们刚刚提出二维平面空间,有一组基:\(\set{(1,0),(0,1)}\),因为其本质就是一个向上方向的单位长度以及向右方向的单位长度,通过不同的组合是可以容易得到全部的向量。根据定义,此时 \(\set{(1,0),(2,0)}\) 因无法组合出 \((0,1)\) 等向量导致其不是基,类似的 \(\set{(1,0),(0,1),(1,1)}\) 也不是基,因为存在 \((1,1)\) 与 \((0,1)\) 线性相关。
基这个东西看起来就是一个很普通的向量集合。你发现二维上似乎无论如何都只能有一个大小为 \(2\) 的向量集合了。将其与常规维度空间联系起来,你发现维度决定该空间基的大小。我们将空间提升到三维,其就必须要含有能描述上下、左右、前后三个方向的三个基向量。以维度的方向理解基,就是最大的完全独立于其他维度的向量集合(长难句起手)。
拟阵
拟阵,英文 Matroid。它用于抽象研究互不多余集合的依赖关系。呃呃呃其实你可以看作学图论时学独立集,我们抛开图论的壳子只讨论独立这些关系的结构。好吧似乎还是很抽象,举几个栗子吧:互不多于的向量、互不冲突的安排、互不成环的图,这些东西相互独立,拟阵就是维护独立子集的结构。
废话不多说,我们直接来看拟阵的具体形态。
拟阵的形态
如下图,这是一个拟阵(?):
这个记号看起来很高大上的样子,我们拆开研究。\(E\):所有可供选择的东西,叫做底集(基础集,Ground Set)。然后 \(\mathcal I\):所有允许的独立组合,叫做独立集族(Family of Independent Sets)。在这里面的集合,我们叫它独立集(终于回到编程的正轨了 T.T)。
独立集的约束要求
虽然 \(E\) 啥都可以选,但是我们现在还不知道 \(\mathcal I\) 能放什么,显然其带有独立二字,一定是有什么规则的。
- \(\varnothing\) 一定是独立的,其不存在冲突。数学语言是 \(\varnothing \in \mathcal I\),我们称其为非空性,至于为什么是这个原因咱也不知道,咱也不敢问(之后我自己思索了一下,这个非空指的是 \(\mathcal I\) 非空,为了让它非空当然要加个空集啊)。
- 假设我们现在已经有了一个独立集 \(\set{a,b,c}\),那么其子集必定是独立的。因为这三个元素已经不冲突地放在了一起,删掉几个又何妨。数学语言是若 \(S\in \mathcal I\),则对于任意 \(V\subseteq S\),必有 \(V\in \mathcal I\),我们称其为遗传性,代表子集可以遗传父独立集优秀的性质。
- (应该是最重要的性质了)再假设我们有两个独立集合 \(A,O\),且 \(|A|<|O|\)(?I AK IOI 这一块),拟阵要求能从 \(O\) 中选择一个元素加入 \(A\) 使其保持独立(注意不是任意一个元素,否则会违背第二条)。数学语言是有 \(A,O\in\mathcal I\) 且 \(|A|<|O|\),则必存在 \(v\in O \setminus A\) 使得 \(A \cup \set{v} \in \mathcal I\),我们称其为扩张性,代表小集合是可以被扩充的。这里举个栗子吧,二维空间的拟阵有 \(\set{(1,0)}\) 与 \(\set{(1,1),(1,-1)}\),此时我们取出 \(\set{(1,1)} \in \set{(1,1),(1,-1)}\),将其放入 \(\set{(1,0)}\) 变成 \(\set{(1,0),(1,1)}\),仍然是符合线性无关的,否则 \(\set{(1,0)}\) 已经违背了拟阵性质,不应当被加入 \(\mathcal I\)。
这三条性质就是 \(\mathcal I\) 的性质,如果 \((E,\mathcal I)\) 符合这三个性质则称其为一个拟阵。其实很简单,就是带空集、子集以及交换元素交换比特。
独立集合与线性拟阵(Linear Matroid)(典型拟阵之一)
向量又回来了!现在,我们考虑用向量组合一个拟阵。我们再定义一个新概念:独立集合,从底集 \(E\) 中选出一个子集,若其线性无关,则其是独立集合,可以加入 \(\mathcal I\) 中。所有独立集合就能组成拟阵了。为什么线性无关就是独立集合呢?我们用一个构造拟阵的栗子来理解一下。
我们现在有 \(E=\left\{\begin{pmatrix}1\\ 0\end{pmatrix},\begin{pmatrix}0\\ 1\end{pmatrix},\begin{pmatrix}1\\ 1\end{pmatrix}\right\}\)。首先其单独的向量 \(\left\{\begin{pmatrix}1\\ 0\end{pmatrix}\right\}\)、\(\left\{\begin{pmatrix}0\\ 1\end{pmatrix}\right\}\) 和 \(\left\{\begin{pmatrix}1\\ 1\end{pmatrix}\right\}\) 绝对是合题的,因为只有一个向量。然后我们考虑两个两个的向量:\(\left\{\begin{pmatrix}1\\ 0\end{pmatrix},\begin{pmatrix}0\\ 1\end{pmatrix}\right\}\),\(\left\{\begin{pmatrix}1\\ 0\end{pmatrix},\begin{pmatrix}1\\ 1\end{pmatrix}\right\}\) 以及 \(\left\{\begin{pmatrix}0\\ 1\end{pmatrix},\begin{pmatrix}1\\ 1\end{pmatrix}\right\}\),这些向量还是符合线性无关的。但是我们发现,\(E\) 不是线性无关的,其出现 \((1,1)=(0,1)+(1,0)\),此时在拟阵的角度看其也不是独立的,我们不将其加入。
类似上面的,称由向量组成的拟阵为线性拟阵(向量空间线性基)。
基、秩与拟阵
注意这里的基(Basis)是指拟阵基(拟阵中的极大独立集),与线性代数的基有些许异同。在拟阵内的基是再也没法加入新元素的集合,与线性代数中无法加入新元素而能表示所有维度的基差不多,再加入就会破坏基的性质。这个东西有点抽象,我们还是举例子吧。
\(E=\set{(1,0),(0,1),(1,1)}\),那么此时基就有三组,\(\set{(1,0),(0,1)}\),\(\set{(1,0),(1,1)}\) 与 \(\set{(1,1),(0,1)}\)。你会发现无论如何都无法往里面插入新的向量了。那么这三个集合就是该拟阵的三组基。
再往深处探究,你发现所有拟阵的基大小完全一样,就如同刚刚的基大小都为 \(2\)。这是拟阵结构所保证的,与线性代数中的基维度决定该空间基的大小有异曲同工之妙。我们称这个基大小为拟阵的秩(Rank)。你可以将其理解为 \(E\) 最多能提供多少个真正独立的信息。
图拟阵(Graphic Matroid)(典型拟阵之一)
感觉拟阵很没用啊,有没有什么实用一点的运用?除了贪心。除了刚刚介绍过的线性拟阵,我们还有一种拟阵叫做图拟阵。设目前我们有几个点与几条边所组成的图 \(G\),其边集为 \(V\)。此时我们规定只要所形成的路径没有形成环,就算独立。你会发现对其建立拟阵,其必定是原图的一颗生成森林。全部的生成森林构成的集合当然是有用的,但是我们现在不确定其是否符合独立集合特征。
我们思考如何证明这个东西。对于线性拟阵,对于不满足独立集的情况,我们有两个向量相加等同于冗余向量,即 \(a,b,c\) 满足 \(a+b=c\),则其不满足线性无关,不独立。然后对于图拟阵,如果三条路形成一个环,则其边不能构造出唯一的路径,即肯定能通过移除一条边(冗余边)使得其变成唯一路径,城市也一定连通。从独立集的三个特性来看:
- 边集选空当然是一个答案,每个点都是自己的子树。
- 子集成立。等同于删除一些边,仍然符合生成森林。
- 交换集合到其他的点也成立。如果两个集合同时存在,其点集必然没有重复,那么显然是合法的。
你发现这与拟阵的独立与冗余的性质也完全符合。所以拟阵就是一种专门用于处理这类独立问题的结构。
圈与拟阵
除了基和秩,还有一个东西叫做圈(Circuit),是拟阵的重要一环。这个东西的定义是拟阵的最小依赖集。这个定义有点难懂,说白点就是自身不是独立集,但是其子集是独立的(删掉任何一个元素就立刻独立)。还是以之前解释基和秩的栗子吧,它恰好就是一个圈。
\(E=\set{(1,0),(0,1),(1,1)}\),根据线性拟阵的定义其线性相关,不是独立集。但是我们删去任何一个元素可以形成 \(\set{(1,0),(0,1)}\),\(\set{(1,0),(1,1)}\) 与 \(\set{(1,1),(0,1)}\) 这三个线性无关的向量集合,形成独立集。那么我们就称这个 \(E\) 是一个圈。
我们将圈的概念放回图拟阵,你发现这个圈正好可以描述全部的三元环。
均匀拟阵(Uniform Matroid)(典型拟阵之一)
不仅有线性拟阵和图拟阵,我们还有均匀拟阵。这个东西比较典型,在 OIwiki 上是第一个讲解的。我们给一个集合 \(E={a,b,c,d,e}\),我们规定最多选 \(3\) 个才能算作独立。这是拟阵的一种情况,因为其有 \(5\) 个元素,且其最多选择 \(3\) 个,我们记其为 \(U_{3,5}\)(或 \(U_{3,E}\))。一般的,我们记录 \(U_{k,|E|}\) 为最多选 \(k\) 个的拟阵。显然其秩为 \(\text{rank}=k\)。
拟阵与贪心
我们在学习贪心的时候总是能遇见拟阵这个东西。贪心的时候一般都有约束条件,超过一定数量或一定条件就不能选择。如果我们将这个问题转化为一个拟阵上的最大权独立集问题,这样的贪心方法就能得到最优解。
有一个抽象版本的建模就是设拟阵有 \(M=(E,\mathcal I)\),我们给 \(E\) 的每一个元素都赋值为一个正整数权 \(w(x)\),我们设一个集合的权为其内元素权 \(w(x)\) 之和。我们考虑通过 \(E\) 生成 \(\mathcal I\),最终里面的最大权独立集往往就是我们贪心的答案,即符合约束和且最优权的贪心决策集合。在具体实现过程中,我们一般是可以先把 \(E\) 按 \(w\) 函数排序,然后从大到小排序。维护一个决策集合 \(A\),每次如果能加入(\(A\cup \set{x}\in \mathcal I\)),就直接贪心合并。这样搞一定能合并出一个拟阵的基出来,最终这个 \(A\) 就是答案了。复杂度 \(\mathcal O(n\log n + nf(n))\)。其中 \(f\) 代表判断 \(\in \mathcal I\) 的复杂度。
::::info[正确性证明]{open}
看起来这个算法和普通贪心没什么区别,所以我们总是会好奇其的正确性。以下给出证明。
:::success[引理]{open}
拟阵 \(M=(E,\mathcal I)\),有子集 \(A\) 为该拟阵最大权独立集 \(T\) 的子集,有集合 \(P=\set{x\mid A\cup\set{x}\in \mathcal I}\),则 \(A'=A\cup\set{\max P}\) 满足 $A'\subseteq $ 某一权值最大独立集。
证明:反证法。假设 \(A'\) 不是任何最大权独立集子集。此时对于 \(T\) 当 \(|A'|<|T|\) 则由拟阵扩张性可知有 \(x\in T \operatorname{and} x\notin A'\) 且 \(A'\cup\set{x}\in \mathcal I\),那么此时就可以有:\(K=A'\cap T\)。设 \(\set{y}=T\setminus K\),\(\set{x}=T\setminus A'\),显然我们有 \(w(y)\le w(x)\)。根据这个,我们可以推导:\(w(K)+w(x)=w(A')\ge w(K)+w(y)=w(T)\)。那么此时其不符合 \(T\) 是最大权独立集或 \(A'\) 不是子集的假设,故该引理成立。
:::
因为该引理成立,所以任何时候的 \(A\) 都是目标 \(T\) 的子集。那么此时这个贪心就是正确的。
::::
你会发现这个合并的过程本质也是按照 \(w\) 贪心来做,但是比一般贪心更多的部分就是 \(\in \mathcal I\) 的判断,通过扩张性来维护正确性,这保证了其能贪心的情况下合法。
最小生成树问题
拟阵贪心的经典例题。我们考虑使用图拟阵(关于其的正确性请看上文)。图拟阵满足联通且无环。我们 \(E\) 中的值就是每一条边,其对应的 \(w\) 就是每一条边的边权,每次从小到大排序,合并判断是否独立集就是是是否存在环,可以使用 并查集来判断(图拟阵的题大部分都是并查集来维护的)。但是由于我们是最大环独立集,所以我们的边权要稍微翻转一下,\(\max V+1-w\) 即可。你发现这个东西变成了我们的 Kruskal,那么图拟阵就是 Kruskal 的正确性证明。
任务调度问题
每个问题都需要 \(1\) 个时间完成,超过一定时间有惩罚,使得惩罚最小(可以使用反悔贪心实现)。我们考虑建立拟阵,其 \(M=(E,\mathcal I)\) 的构造就是 \(E\) 为全部任务,\(\mathcal I\) 为最大独立集使得存在调度总惩罚为 \(0\)。做拟阵题我们首先就是要判断其是否符合拟阵独立集的性质,有:
- 遗传性:显然的,如果有一个大的调度方案已经为 \(0\),不改变保留的调度时间,直接删去构造出来的子集肯定调度为 \(0\),符合性质。
- 扩张性:为了使得 \(|A|<|O|\) 时 \(O\) 中移动一个元素到 \(A\) 仍然满足调度代价为 \(0\),我们选择 \(O\) 的最后一个调度元素,这个元素必定不与 \(A\) 重合,且必定有时间完成以避免代价,符合性质。
因此我们可以证明 \(M\) 是拟阵。对于权值函数,我们照样设为惩罚,这样我们就能通过求解最大权独立集保证可以避免的惩罚最大,这样就可以贪心出最优答案。对于判定是否独立,我们维护一个堆就可以判断了。
线性基
这个东西属于线性代数的范畴,但是我还是将其一并写入在这里。其与有着拟阵千丝万缕的联系,并且还能通过拟阵来证明。这里为了使读者更加清晰地理解异或空间线性基的原理可能会讲的有点长,如果读者不需要如此详细的解释可以考虑跳过这一部分,直接看有关编码的部分即可。
线性基的概念与定义
我们回顾前面提到过的基向量,它可以被定义为所有不重复且可以表示为该线性空间的向量集合,如三维空间一定能找到一组基向量 \(\set{(0,0,1),(0,1,0),(1,0,0)}\),它们通过组合就可以表示为三维空间内的任意向量 \((x,y,z)\)。线性基是线性空间的一组基,可以描述整个线性空间,是研究线性空间(额这个东西的定义有点太复杂且学术了,我还没找到一个比较好懂的解释,你可以理解成一个高维空间吧)的重要工具。
异或空间线性基的概念
对于线性代数,我们一般不会往 bool 层面思考,更不会想异或这个东西的线性代数怎么做。那我们首先将普通的几何线性代数转化为二进制层面上的线性代数。在普通线性代数中,我们有向量:\((1,2,3)\),而在异或空间中,我们有向量 \((101)_2=(1,0,1)\)。
现在向量空间有了,我们该如何对其进行操作呢?为什么我们不考虑异或以外的操作呢?首先我们考虑二进制加减:你会发现其不能简单描述为单个维度上的操作,也无法简单拆分,进位与退位会使得问题变得非常困难。而对于 & 和 |,这更像是在对某些位取 \(\min\) 和 \(\max\),类似赋值而不是向量上的运算。对于 \(\oplus\),这个东西是非常有用的。因为我们知道异或是不进位加法,对于两个向量在高维度相加,不会产生进位退位的问题,非常适合使用向量维护。
那么我们现在就得出了:异或空间的线性基本质是维护高维向量的循环加法。但是我们现在还有一个问题没有解决:常规的线性空间基有一个功能叫线性组合,也就是通过向量加法组合出该线性空间中的全部向量。那么在异或空间中我们该如何实现这一点呢?对于常规线性空间,我们对其组合的本质是给基向量赋予系数,那么在异或空间中我们也可以赋予基向量系数,虽然只有 \(0,1\)。欸你发现这个东西好像和我们的选择有异曲同工之妙。那么此时我们的线性组合就变成了:在线性基之中选几个数并将其异或起来。
既然我们要研究异或空间下的线性基,那么我们也得有相似的概念:异或线性无关、相关。根据线性代数的定义,我们可以知道如果集合内某个向量可以被其他向量表示,则该集合是线性相关的。对于异或空间线性基,我们有完全一样的概念:若集合内某个数可以由其他数异或出来,那么该集合是异或线性相关的。这个东西有个更规范且常见的表达就是存在一个子集异或和为 \(0\),那么就必定线性相关。
总结一下:异或空间线性基只有 \(0\) 和 \(1\),其本质是在维护一个 \(60\) 维的向量,每次对向量加法不进位,效果就是在异或。线性基就是一个向量集合,其中没有子集异或为 \(0\),功能是可以通过给向量赋系数,确定一个数选还是不选,异或出来尽可能多的值。
你发现我们异或空间线性基比我们的拟阵厉害多了,能维护数与数之间的异或关系的组合!而且仅在使用异或一个操作!根据定义,这个东西理论上可以组合成任意数,只要线性基是完整的。那么我们就能联想到其广泛的实战运用。
异或空间线性基的建立
上面的异或空间线性基只是基于理论的,下面我们进入实践。现在我们要插入 \(x\) 这个数到线性基当中,要判断的当然是 \(x\) 能否给当前线性基带来新的信息。构造异或空间线性基的方法就是:不断消掉 \(x\) 最高位的 \(1\)。
:::info[算法流程]{open}
我们现在要求维护出的线性基是:对于每一位,只维护一个其为最高位的线性基。我们设 \(l_i\) 表示当前最高位为 \(i\) 的基向量。现在我们从高到低扫位,如果 \(x_i=0\) 那么还没产生贡献,如果 \(x_i=1\) 那么我们考虑当 \(l_i\) 为空,说明之前没有向量可以负责到这一位,本质是开一个高位,那么我们显然就有 \(l_i=x\)。如果已经有数那么我们就有步骤:\(x\leftarrow x\oplus p\),可以完成消元的步骤。如果最后 \(x=0\),那么显然其被其他基向量消掉了,说明其多余,不应当加入线性基当中。
:::
你可能会问:经过其他数异或了,这能行么?不会改掉原始数值么?我们发现:最开头加入的基是原数,之后插入的数是原数异或出来的数,那么所有插入线性基以及在线性基内发生的修改本质就是在对一个数集进行异或,最后形成的线性基本质也是原始数组异或出来的结果,那么其值没有发生本质改变,对其进行异或无伤大雅,实际操作出来也是没有问题的,并且异或上一个基,其的意义没变的同时最高位变小了,在性质没变的情况下尽可能多覆盖可能位,使得维度更广,可能结果更多。则这个贪心一样的插入正确。
异或空间线性基的性质
由于每个向量可以选择选与不选,而每个的选择会使得一位变得独一无二,且其线性无关导致不会出现重复的异或结果,所以 \(r\) 位的线性基可以组合成 \(2^r\) 个数,也就是几乎全部向量集。这个性质让它在维护异或相关问题时非常有用。注意:最高位可以是 \(n\),但是不一定是个 \(n\) 位线性基,有可能恰好一位啥都没有,所以能组成数的个数还是得看秩(\(r=\text{rank}\))。
还有一个值得注意的是线性基会随着插入的顺序发生改变,所以线性基不唯一。
异或空间线性基的用途
说了这么多,这东西看起来确实很有用,但是怎么用呢?接下来我将会介绍一些经典用途,内容会稍微轻松一些。
- 一个数是否能被异或出来。因为线性基存在线性无关的性质,所以像插入一样,判断其是否最终被消成 \(0\) 即可。具体的,从大到小每一位扫一遍,每次如果遇到自身为 \(1\) 但是不存在该线性基,那么其一定不能被异或出来,否则异或它,并接着往后扫消元。如果最后自身变成 \(0\),说明被异或没了。(本质是一个很复杂的高斯消原,但是线性基简化了这一过程 XD)
- 求子集异或最大值。这个够常见了吧!对于最大值,我们考虑二进制逐位考虑。你发现一个数一定是能掌控这一位的,如果对答案没有贡献其实也可以不异或了,所以最大值就是不停贪心的取选择一位,如果对答案有贡献就异或上去。
说什么胡话呢!好吧具体讲讲。对于每一位,如果不改它,那么之后就没机会改了。所以如果之前这一位就有值,其不可能使答案变大,反之亦然。
复杂度分析:对于每个数的操作都只是扫一遍全部维度,复杂度 \(\mathcal O(\log V)\),非常优秀。
实战篇
嗯对这种冷门的东西居然有例题。
P4301 [CQOI2013] 新Nim游戏
这题是一个异或空间线性基,但是需要使用拟阵来证明。谁懂我一天写了个万字长文就为了研究清楚这一道蓝题的救赎感。当然为了一盘醋包了个饺子其实也很有必要。废话不多说,直接来看题目大意。
Nim 游戏,第一个回合(一组先后手)多了个能删若干堆的规则,其他一样。删堆不能全删完。首先我们考虑 Nim 游戏的答案:SG 异或全为 \(0\) 则先手必败。此时先手必胜就是动态删掉几堆后发现有情况能让后手弄不出异或和为 \(0\)。插入线性基时,只需要在失败的时候删掉这一堆即可(不然会被后手捡漏)。此时我们就发现沿用这个策略先手一定必胜。此时题目还要求最小化取出值,贪心考虑从大到小插入,这样保证构造出的线性基(注意线性基不唯一)能保留住尽可能大的数。
证明正确性?贪心?考虑拟阵!我们稍微回忆一下拟阵三性质:非空、遗传、扩张。我们现在要用拟阵证明贪心返回的一定是一个最优决策集合,那么首先你得确定这是个拟阵(设火柴所构成的集合为 \(E\),若 \(A\in E\) 且其是一个异或空间线性基,那么 \(A\in \mathcal I\),即证 \(M=(E,\mathcal I)\) 是个拟阵)。
- 能被放入 \(\mathcal I\) 且具有独立性。这个是由线性基的线性无关所决定的,显然正确。
- 符合非空性与遗传性是显然的,线性基少了一个当然还是线性无关的。
- 扩张性有点难。我们设 \(|A|<|O|\),\(A,O\in \mathcal I\)。首先我们可以确定其元素一定不同,反证法。假设 \(O\) 中所有元素都可以被 \(A\) 子集表示(否则一定能找到一个 \(O\) 中元素放入 \(A\) 中,符合扩张性),其必然异或值为 \(0\),则由 \(O\notin \mathcal I\),不符合题意。故一定符合扩张性。
所以线性基符合独立集,是个拟阵,贪心正确。
:::success[通过代码]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e2+10, M=33;
int l[N],n,a[N]; ll ans;
bool Insert(int x){
for(int i=30;~i;--i) if((x>>i)&1){
if(!l[i]){ l[i]=x; return 1; }
else x^=l[i];
}
return bool(x);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,greater<int>());
for(int i=1;i<=n;i++)
if(!Insert(a[i])) ans+=a[i];
cout<<ans;
return 0;
}
:::
参考资料
- OI-wiki 的相关知识:https://oi-wiki.org/math/matroid/ 以及 https://oi-wiki.org/math/linear-algebra/basis/ 。以及为什么那里的 \(\mathcal I\) 打出来像 \(J\)?
- 洛谷日报:https://www.luogu.com.cn/article/87d02q9f 。
- GPT5.6 使用形象的举例(在线演示功能)使得我更加理解概念。
:::warning[AIGC]{open}
本文作者使用 AI 进行了算法学习,但是保证全文内容的贡献全部属于作者本人,即未使用 AI 进行任何有关文本修缮、编写的操作。
:::

浙公网安备 33010602011771号