线性代数
线性代数
线性基
一般指 01 向量张成线性空间的基底。是一个上三角矩阵。
一般来说,对于 \(m\) 维向量,单次插入线性基是 \(O(\dfrac{m^2}{w})\) 的,多数情况下 \(m\leq w\),此时复杂度为 \(O(m)\)。
带删除的线性基
线性基可以在 \(O(\dfrac{nm}{w})\) 的时间内删除单个元素,应用场景是 \(m\) 较大的情形。
具体实现考虑记录下每个向量由原本的哪些向量异或得到。
删除原本的向量 \(i\) 时,分情况讨论:
- 存在一个非基向量的组成中有 \(i\),我们用此向量的组成情况去给其它组成中有 \(i\) 的向量消元即可,由于是非基向量,已经消成 0,不会对基向量产生影响。消完后删除这个非基向量即可。
- 不存在一个非基向量的组成中有 \(i\),我们只能在基向量中找到有 \(i\) 组成的向量,我们找到最低位满足条件的基向量,对其它位消元,最后把这个基向量删除即可。
区间线性基
除了较为暴力的使用线段树/猫树直接维护区间线性基,对于没有修改的情形我们有更好的做法。
考虑离线从前往后加入元素,我们希望尽量保证线性基内的元素都是最靠后的。
当枚举到一个当且元素有值的 bit 时,我们令这个位置的基向量为当前元素,保留一个时间戳,然后把基向量异或上当且元素递归下去。
那么区间 \([l,r]\) 的线性基底,就是处理到 \(r\) 时,时间戳 \(\geq l\) 的基向量集合。
k 进制线性基
博主联考刚学的,场上写了个爆搜拿了 85pts/tx。
\(k\) 可以是合数。
我们插入元素时对元素辗转相除以规避没有逆元的情形。
查询线性基是否可以表示一个元素时,\(k\) 为质数时因为有逆可以很轻松的实现,若系数没有逆,我们可能有多种消除方案。具体的,假如当前要用 \(a\) 去消 \(b\),记 \(g=\gcd(a,k)\),\(ax\equiv b\pmod k\),这里对于一个合法的解 \(x\) 是一个公差为 \(\dfrac{k}{g}\) 的等差数列。
处理方法也很简单,插入元素时当我们要在基里加入新元素,将基的 \(\dfrac{k}{g}\) 倍继续往下插入即可。
时间复杂度取决于维数,除了辗转相除的部分和 \(k\) 没啥关系。
矩阵树定理
相比于以 prufer 序列推导相关问题可能处理难度更低。
基本介绍可以参考:矩阵树定理学习笔记。
LGV 引理
感觉再考一遍的概率很低。