线性代数(?)相关内容
线性基
贪心插入的线性基满足 \(p_i\) 的二进制最高位为 \(i\)。通过 \(O(\log^2)\) 的消去变换(每一个位置都往下遍历一圈,每次消去最高位的 \(1\)),可以得到每个任意两个 \(p\) 不交的基。
-
求异或第 \(k\) 小:将原始基变换为 \(p\) 不交的基。按最高位从小往大遍历每一个有值的位置,若这是第 \(x\) 小的基,则看 \(k\) 的第 \(x\) 位是否是 \(1\),若是,则让答案异或上当前基的值。
-
线性基求交:对于两个不同线性空间 \(P,Q\) 的基 \(A,B\),我们设 \(W=P\cap B\),有结论:若 \(A\cup(B-W)\) 线性无关,则 \(W\) 是 \(P,Q\) 的交的一组基。反证法易证。于是考虑维护两个基 \(X,Y\),其中 \(X\) 作为最终的答案基,时刻保证 \(X+Y\) 与 \(B\) 同构且 \(Y\cup A\) 线性无关即可。具体地,我们每次加入一个 \(B\) 中的元素 \(b\),若 \(b\) 能被 \(Y\cup A\) 表出,则求出涉及到 \(A\) 内的元素的异或和 \(b^{\prime}\)。你发现在 \(B\) 中把 \(b\) 替换为 \(b^{\prime}\) 得到的基与 \(B\) 同构,因此令 \(b\gets b^{\prime}\),此时 \(b\) 显然在 \(P\) 中,故直接把 \(b\) 加入 \(X\) 即可。否则,原来的 \(b\) 加入 \(Y\) 后仍然满足线性无关,加入 \(Y\) 即可。
具体的实现上,我们考虑直接维护 \(Z=Y\cup A\) 这组基,初始时 \(Z=A\)。每次枚举一个 \(b=B_i\),扔进 \(Z\) 中遍历。若在某个位置上发现 \(b\) 可以插入 \(Z\),则让 \(B\) 插入 \(Y\) 和 \(Z\) 的对应位置;否则令 \(b\) 异或上 \(Z\) 当前位置的值,同时维护 \(y\) 表示由 \(Y\) 贡献的值的异或和,令 \(y\) 异或上 \(Y\) 当前位置的值即可。最终走出来,若发现原来的 \(b\) 可以被 \(Z\) 表示,则 \(b^{\prime}=b\oplus y\),将 \(b^{\prime}\) 插入 \(X\) 的第 \(i\) 个位置即可。写法可以见上面的日报。
-
带删除线性基:离线,维护每个值的删除时间。我们希望高位基的删除时间尽可能晚,因此对每个数,从插入的高位开始枚举,能插入(指原有 \(t\) 小于当前 \(t\))就交换两个。遇到空的,直接插入并退出。
QOJ7679. Master of Both IV
注意一个集合的异或值一定小于这个集合最大值的两倍。因此要满足整除的条件,这个集合的异或值必须是最大值或 \(0\)。考虑排序后枚举最大值,方案数即为选择所有在它之前的集合,使得集合异或和为 \(0\) 的方案数。考虑对每个值维护一个其出现过的因数的线性基,设成功插入了 \(x\) 个数,总共出现了 \(c\) 个因数,则方案数为 \(2^{c-x}\)。然后待所有数都插入线性基后,考察总的方案中异或为 \(0\) 的个数即可,记得减去空集。
P4869 albus就是要第一个出场
对于一个大小为 \(n\) 集合,若其线性基大小为 \(x\),则可以异或出来的数中,每个不同的值(包括 \(0\))都会出现 \(2^{n-x}\) 次,原因是每种非基底部分的选法都会对应一种使得总异或值等于目标的选法。于是只需要算出来 \(Q\) 在线性基中的排名即可,可以维护一个后缀上基的个数,类似 Trie 上那样做即可。
P9580 「Cfz Round 1」Wqs Game
\(w(l,r)=1\) 的充要条件是不存在一个 \(i\in[l,r]\) 使得 \(b_i=1\) 且 \([i+1,r]\) 内所有 \(b_j=0\) 的数组合不出来 \(a_i\)。这是一个线性基问题。我们有如下两个观察:
- 对于某个固定的 \(i\),显然是一段右端点的后缀合法。于是可以设 \(r_i\) 表示最小的 \(x\),使得 \([i+1,x]\) 中的所有 \(b_j=0\) 的 \(a_j\) 能组合出 \(a_i\)。
- 对于某个固定的右端点,使得 \(w(l,r)=1\) 的 \(l\) 一定是一段后缀。于是可以设 \(pos_i\) 表示最小的 \(l\) 使得 \(w(l,i)=1\)。\(pos\) 可以利用 \(r\) 求出,具体地,每个 \(i\) 都会给 \([i,r_i-1]\) 内的 \(pos\) 做一个区间对 \(i+1\) 取 \(\max\)。
求出 \(pos\) 后,可以考虑扫描线,将询问挂在 \(R\) 上,扫到 \(i\) 时,先对 \([1,pos_i-1]\) 做区间加 \(1\),然后回答所有右端点为 \(i\) 的询问,是在 \([L,R]\) 内区间求和。
于是问题变为怎么求 \(r_i\)。最暴力的方法是从 \(i\) 开始依次往后枚举,复杂度 \(O(n^2)\);其次可以线段树套线性基,有两个 \(\log\) 且常数较大。
考虑从右往左枚举 \(i\)。注意到当你判断到 \([i+1,x]\) 中所有值组合不出 \(a_i\) 时,一定有 \(pos_x>i\),因此在更小的 \(i\) 处,就不必再判断 \(x\) 是否合法了,因为无论结果如何,都不可能改变 \(pos_x\) 的值。因此,我们直接将 \(x\) 与 \(x+1\) 的对应线性基合并,之后再有判断时,直接考虑 \(x+1\) 处是否合法。若合法,则令 \(r_i=x+1\),否则继续往后合并......。
注意分析好合并的复杂度:由于合并最多发生 \(n\) 次,则总的成功插入的次数显然是 \(O(n\log V)\);我们在插入一个数的时候,从它的最高位开始往下遍历,那么每一个 \(a\) 在全过程中的所有遍历里失败插入的次数不超过 \(\log V\) 次,因为每失败一次,最高位就会被消除掉。因此总复杂度 \(O(n\log V)\)。
到此,此题总复杂度 \(O(n\log V+(n+q)\log n)\)。
矩阵树定理
求一张图所有生成树边权乘积的和。构造邻接矩阵 \(A\)(元素为边权)和度数矩阵 \(D\)(带边权度数,可以理解为权值为 \(x\) 看作 \(x\) 条边),则 \(L=D-A\)。
外向有根树使用入度 Laplace \(n-1\) 阶主子式计算(每个点的入度为 \(1\)),内(根)向有根树用出度 Laplace \(n-1\) 阶主子式计算,缺的是根。
P3317 [SDOI2014] 重建
我们知道,设一条边的权值为 \(w_i\),那么矩阵树定理求的是 \(\sum_{T}\prod_{e\in T}w_e\),其中 \(w\) 是某个边的权值。此题要求的是 \(\sum_{T}\prod_{e\in T}p_e\prod_{e\notin T}(1-p_e)=\prod(1-p_e)\sum_T\prod_{e\in T}\frac{p_e}{1-p_e})\)。注意带权后,你的度数矩阵也要跟着带权,可以理解为权值和矩阵。该题中,若 \(p=1\),则需要给 \(p\) 加一个极小的偏移使得不除 \(0\)。
P6624 [省选联考 2020 A 卷] 作业题
用欧拉反演把 \(\gcd\) 拆掉:
考虑求后面两个和式,也即所有生成树的边权和的和,我们知道矩阵树定理只能求所有生成树的边权乘积的和。考虑用乘积表示和的形式,你发现能做到这个事情的只有多项式的乘积(因为是卷积形式,本质上是一些乘积)。我们考虑用多项式表示边权,设边权为 \((w_ix+1)\),则边权的一次项系数即为原来的权值和。
注意在乘的过程中,我们只需要维护 \(0,1\) 两次的值即可,也即维护模 \(x^2\) 意义下的多项式,设为 \((ax+b)\) 和 \((cx+d)\)。乘法是容易的,考虑除法,用多项式求逆的那一套东西做即可。由于只有两项,所以可以直接把式子推出来。注意常数项为 \(0\) 时没有逆元,因此我们需要找到常数项不为 \(0\) 的一行交换上来;若每一行常数项都为 \(0\),则此行的相消可以只看一次项,不看常数项,当成普通的数来做即可(如果不这么写,UOJ 上有 hack 会挂掉)。
这样做复杂度是 \(O(n^3v)\),略大。一个优化是我们只对可行边数不小于 \(n-1\) 的 \(d\) 做矩阵树定理,由于一条边最多会被算 \(d=200\) 次左右,故这部分复杂度 \(O(\frac{dn^2}{n}\times n^3)\),则总复杂度 \(O(v\log v+n^4d)\),且跑不满。
BEST 定理
有向图无源欧拉回路的数量为 \(T\prod(deg_i-1)!\),其中 \(T\) 为任意某个点为根的根向树(或叶向树)的数量。考虑令树的方向为点最后一次遍历到后出去的方向,理解是容易的。注意欧拉图中入度和出度相等,\(deg\) 指任意一个均正确。
[AGC051D] C4
这等价于求欧拉回路数量。但无向图欧拉回路数量是不好求的,因此考虑给边定向。注意到入度等于出度,故枚举任意一条边的组合形式即可给所有边完成定向。求根向树的部分也是容易的,直接枚举断边即可。注意下面两个修正:
- 我们求的是有起点的欧拉回路,故最终要乘 \(deg_1\)。
- 边之间不做区分,所以 \(8\) 种重边都要除阶乘。
LGV 引理
设 DAG 上有大小为 \(n\) 的起点集合 \(S\) 与终点集合 \(T\),现有 \(n\) 个棋子分别从 \(S_i\) 出发走到 \(T_{p_i}\),设其的一组不相交路径 \(P_p\) 的路径权值乘积为 \(w_P\),一条路径的权值是所有边权的乘积。
构造矩阵 \(A_{i,j}\) 表示从 \(S_i\) 走到 \(T_j\) 的所有路径的权值和,则 \(A_{i,j}\) 的行列式为 \(\sum_{p}\sum_P(-1)^{t(p)}w_P\)。也即每一组带权路径权值乘积的有符号和。
P7736 [NOI2021] 路径交点
看到路径不交显然可以想到 LGV。考虑层间交点的意义:出现一个交点等价于形成了一个或撤回了一个逆序对。因此交点的奇偶性就是起点终点对应排列的逆序对个数奇偶性。后面的贡献乘积仍然是 \(1\),于是你发现答案就是 LGV 引理的那个式子,BFS 把矩阵求出来,求行列式即为答案。
P9041 [PA2021] Fiolki 2
首先,我们要求看不交路径是否存在,第一反应是看行列式是否为 \(0\)。但由于带符号,数量可能抵消导致行列式为 \(0\),因此我们需要给边带权值,这样不同路径带不同权值,大大降低了加减变成 \(0\) 的可能性。
行列式 \(=0\),意味着行向量或列向量线性相关。因此 \([l,r]\) 内最多可以转移到多少种物质,实际上是 \([l,r]\) 内最多能选出多少个线性无关的列向量,这个东西可以使用多项式线性基来维护,仍然是从高往低依次枚举每一位,遇到空位就插入;否则就消去这一维。加入一个列向量的复杂度为 \(O(k^2)\)。
在 \(k\) 次拓扑排序过程中可以求出 \(k\times n\) 的矩阵。考虑扫描线扫右端点,利用带删除线性基的贪心技巧,维护每个列向量所处的列,尽可能保留较靠后的列。插入结束后,给每个列向量的所属列进行排序,即可求到以 \(r\) 为右端点的所有区间中,分别有多少个的最大线性无关列向量数目为 \(0\sim k\) 中的某个值。
整个计算流程都可以在模一个大质数的意义下进行,正确率可以感受到是很高的。
[ABC216H] Random Robots
给每一个时刻建立点,则等价于从 \((0,x_i)\) 走到第 \(n\) 列,每次可以走到 \((i+1,j)\) 或 \((i+1,j+1)\),得到的不相交路径组数量除掉 \(2^{kn}\)。利用 LGV 引理不难发现我们要求的就是那个行列式,但没法暴力求。设枚举的递增的终点序列为 \(y\),从 \((1,x_i)\) 走到 \((n,j)\) 的方案数为 \(e(i,j)\),把式子写出来:
是若干个乘积求和的形式,考虑直接 dp 算。由于我们需要知道逆序对数目,所以需要记录每个起点选择终点的相对位置。状压,设 \(f_{i,S}\) 表示考虑到 \((n,i)\),集合 \(S\) 内的起点已经选好了对应的 \(y_{p_i}\) 的权值和。转移是容易的。复杂度 \(O(2^knk)\)。
QOJ3082. Ascending Matrix
对杨表的值的间隙作出 \(k-1\) 条分割线,每条线从左下角 \((n,0)\) 出发,到右上角 \((0,m)\),则线之间相交但不交错。考虑把第 \(i\) 条分割线的竖直段向右平移 \(i\),水平段向下平移 \(i\),延长相交,则形成 \(k-1\) 条不相交路径,起点是 \((n+1 \sim n+k-1,1)\),终点是 \((1,m+1\sim m+k-2)\)(不能与轴相交,否则无法填入间隔方块),可以利用 LGV 计算数量。钦定每条分割线的左侧和上方首个格子不填数,则路径组与原杨表一一对应。
对于 \(a_{R,C}=V\) 的限制,也就是要求 \((R,C)\) 格子上方有恰好 \(V-1\) 条分割线。平移后,也即格边 \((R+V-2,C+V-2)\to (R+V-2,C+V-1)\) 及其上方的所有横向边,有 \(V-1\) 条路径。注意由于一条分割线外,左侧和上方首个格子不填数,故我们要求剩余的分割线只经过 \((R+V,C+V-1)\to (R+V,C+V)\) 及更下方的所有横向边。利用生成函数思想,我们设一条上面的边权值为 \(x\),下面的边权值为 \(1\),不合法路边权值为 \(0\)。则一个合法路径组的权值为 \(x^{v-1}\)。根据 LGV 引理,我们就是要求行列式对应多项式的 \(x^{v-1}\) 项系数。
暴力计算行列式的复杂度达到 \(O(k^4\log k)\) 或 \(O(k^5)\),考虑带入 \(k+1\) 个点值计算行列式值,然后插值把第 \(v-1\) 次系数插出来即可。复杂度 \(O(k^4)\)。算经过/不经过上面的路径数可以直接暴力 dp 做。

浙公网安备 33010602011771号