来回顾一下对于给出$n$个数,选出$k$个数,使得它们异或和最大的问题。
当$k = 2$时,可以用Trie上贪心把它水过去。
那当k自定时呢?
从这里开始
向量和向量空间
向量是有方向和有大小的量,$n$维向量可以用一个$1\times n$或者$n \times 1$的矩阵来表示,例如
$\vec{a} = \left(a_{1}, a_{2},\cdots, a_{n}\right)$或$\vec{a} = \left(a_{1}, a_{2},\cdots, a_{n}\right)^{T} $
称$a_{i}$是向量$\vec{a}$的第$i$个坐标或第$i$个分量。
坐标都是0的向量是零向量,记作$\vec{0}=\left ( 0,0,0,\cdots,0 \right )$。
向量的加法:将两个$n$维向量对应下标相加
$\vec{a} + \vec{b} = \left ( a_{1} + b_{1}, a_{2}+ b_{2}, \cdots, a_{n} + b_{n}\right )$
向量的数乘:将数$\lambda $与$n$维向量$\vec{a}$相乘,定义为:
$\lambda \vec{a} = \left ( \lambda a_{1}, \lambda a_{2},\cdots, \lambda a_{n} \right )$
向量空间:若四元组$\left(P, V,+,\cdot \right)$中$P$为域,$V$为非空$n$维向量集合,+为向量加法,$\cdot$为向量的数乘运算,满足:
- 向量加法满足对于任意$\vec{a}\in V,\vec{b}\in V$满足$\vec{a}+\vec{b}\in V$
- 向量的数乘满足对于任意$\vec{a}\in V,\lambda\in P$满足$\lambda\vec{a}\in V$
则称四元组$\left(P, V,+,\cdot \right)$为一个向量空间。
向量空间的线性相关性和基
若存在一组系数$k_{1}, k_{2}, \cdots,k_{m}$,使得
$\vec{b} = k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m}$
则称$\vec{b}$是$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的一个线性组合。或者说,$\vec{b}$能被$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$线性表示。
设向量空间的向量集合为$V = \left \{ \vec{a}_{1},\vec{a}_{2},\cdots,\vec{a}_{m} \right \}$,若存在一组不完全为0的系数$k_{1}, k_{2}, \cdots,k_{m}$使得
$k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m} = \vec{0}$
则称这个$m$个向量线性相关,否则称它们线性无关。
若向量空间中存在$\mathfrak{B} \in V$,且满足$V$中任意一个向量都能被$\mathfrak{B}$中的所有向量唯一地线性表示,那么称$\mathfrak{B}$是向量空间$\left(P, V,+,\cdot \right)$的一个基。
然后用一个定理来结束这一节的内容。
定理1 若$\mathfrak{B}$为向量空间的基,则$\mathfrak{B}$中向量线性无关。
证明 使用反证法,设$\mathfrak{B}=\left \{ \vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m} \right \}$线性相关,那么存在一组不完全为0的系数$k_{1}, k_{2}, \cdots,k_{m}$使得
$k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m} = \vec{0}$
假如第一个不为0的系数为$k_{t}$,那么移项得到
$\vec{a}_{t} = -\frac{k_{1}}{k_{t}}\vec{a}_{1}-\frac{k_{2}}{k_{t}}\vec{a}_{2}-\cdots-\frac{k_{t-1}}{k_{t}}\vec{a}_{t-1}-\frac{k_{t+1}}{k_{t}}\vec{a}_{t+1}-\cdots-\frac{k_{m}}{k_{m}}\vec{a}_{m}$
显然$\vec{a}_{t} $还可以通过它自己线性表示。不满足基的定义,与命题矛盾。
所以$\mathfrak{B}$中向量线性无关。
异或意义下的基
此处定义以下谈论的向量空间是指四元组$\left ( V,P=\left\{0, 1 \right\},\oplus,\cdot \right )$,其中$\oplus$为异或运算。
将每个数二进制拆分后看成一个向量,然后可以通过高斯消元来求解$V$的极大线性无关子集。
现在希望证明它满足基的另一条定义,即$V$中向量能够被唯一地线性表示。
定理2 若向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一,当且仅当它们线性无关。
证明 先证明它们线性无关时,向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一。
假设存在两组不同的系数$\lambda_{1},\lambda_{2},\cdots,\lambda_{m}$和$\mu_{1},\mu_{2},\cdots,\mu_{m}$使得
$\lambda_{1}\vec{a}_{1} + \lambda_{2}\vec{a}_{2} + \cdots\lambda_{m}\vec{a}_{m} = \mu_{1}\vec{a}_{1} + \mu_{2}\vec{a}_{2} + \cdots \mu_{m}\vec{a}_{m}$
可得
$\left (\lambda_{1} - \mu_{1} \right )\vec{a}_{1} + \left (\lambda_{2} - \mu_{2} \right )\vec{a}_{2} + \cdots\left (\lambda_{m} - \mu_{m} \right )\vec{a}_{m} = \vec{0}$
因为它们线性无关,所以$\lambda_{1} = \mu_{1} ,\lambda_{2} = \mu_{2}, \cdots,\lambda_{m} = \mu_{m}$。
与假设矛盾。所以命题成立。
然后证明向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一时,则它们线性无关。
假设向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一,那么对于两组系数$\lambda_{1},\lambda_{2},\cdots,\lambda_{m}$和$\mu_{1},\mu_{2},\cdots,\mu_{m}$,使得
$\lambda_{1}\vec{a}_{1} + \lambda_{2}\vec{a}_{2} + \cdots\lambda_{m}\vec{a}_{m} = \mu_{1}\vec{a}_{1} + \mu_{2}\vec{a}_{2} + \cdots \mu_{m}\vec{a}_{m}$
那么用同样的方法可以证明它们线性无关。
因此通过高斯消元得到的极大线性无关子集是向量空间的一个基。
但是感觉高斯消元代码太长了。有没有代码量小一点的写法?
由于行向量组进行初等行变换(高斯消元)后得到的阶梯型矩阵,有很多零行,很浪费。
考虑让第$i$列的主元是$a_{ii}$那么,可以通过尝试向向量组内依次插入每个数,然后套用高斯消元的做法。
于是得到了较短的代码(其实和高斯消元一样长,只是可以减小常数)
1 memset(b, 0, sizeof(b)); 2 ll x; 3 int cnt = 0; 4 for(int i = 1; i <= n; i++) { 5 scanf(Auto, &x); 6 if(cnt < 63) 7 for(int j = 62; ~j; j--) { 8 if(x & (1ll << j)) x ^= b[j]; 9 if(x & (1ll << j)) { 10 b[j] = x; 11 cnt++; 12 for(int k = j - 1; ~k; k--) 13 if(b[j] & (1ll << k)) 14 b[j] ^= b[k]; 15 for(int k = j + 1; k <= 62; k++) 16 if(k != j && (b[k] & (1ll << j))) 17 b[k] ^= b[j]; 18 break; 19 } 20 } 21 }
扯了一大堆,相信读者还是不知道什么是"线性基"。
那什么是"线性基"呢?我们常说的"线性基"是指在高斯消元后得到的向量组。
好。然后和开篇提出的问题有什么关系?
我们考虑贪心地想一想。除了基以外的向量能被基线性表示,那么选取了它不会更优。
对于基内向量,我们希望高位尽量为1,那么就把线性基内数异或起来得到的数就是最大子集异或和。
因为我们就线性基的过程已经劲量使得高位劲量为1。
(To be continued...)
参考资料
《线性代数与空间解析几何(第二版)》 韩流冰 叶建军 何瑞文 编
特别鸣谢
Doggu
QJX
MaxMercer