改造后的线性基有一个性质,就是假设 w 是若干个 c_j 异或得到的,其中 j>i,若 c_i>0,则 w<w\oplus c_i,因为最简行阶梯矩阵满足除 c_i 以外的数第 i 位都为 0,则 w 的第 i 位也为 0,而异或上 c_i 不会影响 i+1 以后的位。
求出 b_i 表示 c 中第 i 个非零元素(i 从零开始)。则第 k 小的异或和即为:将 k 转化为二进制数,所有为 1 的位 i 对应的 b_i 的异或和。
注意一种特殊情况,就是原集合 S 中存在线性相关的元素,则可以异或出 0,k\leftarrow k-1 即可。
时间复杂度 O((n+m)\log s_i)。
提交记录
例题:CF895C Square Subsets
能表示成整数的平方,意味着每个质因子的次数都是偶数。将每个数按每个质因子的次数奇偶性写成一个二进制数,第 i 位为 1 表示第 i+1 个质数的次数为奇数。所求即为异或和为 0 的非空子集个数。若共有 n 个数,线性基中有 t 个数,则另外 n-t 个数的任意一个子集的异或和,有且仅有一个基中 t 个数的子集的异或和与之相等,去掉空集以后方案数即为 2^{n-t}-1。
例题 2:CF724G Xor-matic Number of the Graph
异或线性基结合图论的简单题。异或有一个重要的性质,就是 x\oplus x=0,所以一条边走两遍贡献会抵消掉。考虑对每一个连通块,随便钦定一个根,求一棵生成树,记 d_x 为点 x 到根的路径边权异或和。每一条非树边 (u,v,w) 对应一个权值为 d_u\oplus d_v\oplus w 的环。任意两点 u,v 的路径,一定可以表示成 u 到 v 的树上路径,再加上任意个环。
将所有环的权值加入线性基,所求即为 \sum d_u\oplus d_v\oplus x,其中 x 为线性基的任意一个子集的异或和。记 w_{i,0/1} 表示异或和第 i 位为 0/1 的子集数量,可以通过 dp 求出,dp_{j,i,0/1} 表示只考虑线性基的前 j 个数的答案。线性基元素个数不超过边数,所以这部分复杂度是 O(m\log t_i)。然后枚举连通块内的点 x,求出 f_{i,0/1} 表示 x 以前的点 y 满足 d_y 的第 i 位为 0/1 的个数,设 x 的第 i 位为 b,则将 2^i\times (f_{i,b}\times w_{i,1}+f_{i,\neg b}\times w_{i,0}) 加入答案,这部分复杂度 O(n\log t_i)。总的复杂度即为 O((n+m)\log t_i)。
证明:根据 W 的定义有 W 中的元素线性无关,所以 W 是对应向量空间的基。根据 W 的定义,W 中的向量都能被 B_1 和 B_2 分别表示。因为 B_1\cup (B_2\setminus W) 线性无关,所以 B_2\setminus W 中的向量不能被 B_1 表示。所以 W 是 V_1\cap V_2 的一组基。
若 x 能被 tmp 表示,则 x 对应 ans 中的一个元素,但根据 W 的定义还需要满足 x\in V_1,考虑将 x 拆分为 S,T 的线性组合,其中 S\subset B_1,T\subset (B_2'\setminus W),令 s=\oplus S_i,则在 ans 中加入 s。设 x 不为 0 的最高位为 i,因为当前 B_2'\setminus W 中的元素第 i 位一定为 0,所以 s 第 i 位一定为 1,可以直接令 ans_i=s。
容易发现答案只与 C 的秩有关,因为对 C 做初等行变换时对 A 做相同变换,对 C 做列变换时对 B 做相同变换,A\times B=C 仍然成立。
令 C_i 表示 C 的列向量,A_i 表示 A 的列向量。因为 C_k 是由 A_j 异或成的系数为 B_{j,k},所以 C_i 在 A_i 的向量空间中。固定 A,C 不变,且 C 满足 C_i 在 A_i 的向量空间中,则对于每个 C_k,C_k=(A_1A_2\cdots A_q)B_k 的解数即为 2^{q-x},其中 x 为 A 的秩,B 的总方案数即为 2^{(q-x)s}。
枚举 A 的秩 x。设 C 的秩为 r。记 f_{i,j} 表示 p\times i 的秩为 j 的矩阵个数,g_{i,j} 表示 s\times i 的秩为 j 的矩阵个数。固定 A 不变,合法的 C 的每个列向量都可以用 A_i 的基表示,可以写成一个 s\times x 的秩为 r 的矩阵,方案数为 g_{x,r}。而 A 的方案数为 f_{q,x},答案即为 (\sum_{r\leq x\leq \min(p,q)} f_{q,x}g_{x,r}2^{(q-x)s})/f_{s,r},可以线性计算。f,g 可以 O(n^2) 递推预处理。
现在只需要维护 C 的秩,用带删除线性基即可,这部分复杂度 O(n^2m/w)。
例题 2:#91. 【集训队互测2015】最大异或和
记 span(S) 为向量集合 S 的向量空间,显然有 span(v_1,v_2\cdots v_n)=span(v_1,v_2-v_1\cdots v_n-v_{n-1})。