线性基基础

介绍

基是线性代数中的一个概念,而在现行OI中,通常利用基在异或空间的一些特殊性质来解决问题,而这类问题涉及的知识被称为【线性基】

异或运算下的基:

对于数 $a_0, a_1,..., a_n$ 将 $a_i$ 的二进制表示成 $(b_0,b_1,...b_n)_2$ 可看作一个向量,异或运算下的基就是 $(a_0, a_1, ... a_n)$ 中的极大线性无关组。

设 $V$ 是 $(a_1, a_2,...,a_n)$ 构成的空间,求 $V$ 的基。初始化 $\alpha = (a_0, a_1, ...a_n)$.

  1. 若 $a_1=0$,则从 $\alpha$ 中去掉 $a_1$;否则保持 $\alpha$ 不变
  2. 若 $a_2 \in V(a_1)$,则从 $\alpha$ 中去掉 $a_2$;否则保持 $\alpha$ 不变
  3. 若 $a_j\in V(a_1,a_2,...,a_{j-1})$,则从 $\alpha$ 中去掉 $a_j$;否则保持 $\alpha$ 不变

如何判断一个向量是否已经属于线性空间,可以利用高斯消元,判断 $a_j$ 能否表示成 $a_1,a_2,...,a_{j-1}$ 的线性组合。

插入

令插入的数为 $x$,考虑 $x$ 的二进制最高位 $i$:

  • 若线性基的第 $i$ 位为0,则直接在该为插入 $x$,推出;
  • 若线性基的第 $i$ 位已经有了值 $a_i$,则 $x = x \bigoplus a_i$,重复以上操作直到 $x=0$

如果退出时 $x=0$,则此时线性基已经能表示原先的 $x$ 了;反之,则说明为了表示 $x$,往线性基中加入了新的元素。

很容易证明这样的复杂度为 $O(\log_2n)$(即二进制的位数),也可以通过这种方法判断能否通过原数列异或得到一个数 $x$.

判断

例题

洛谷P3812

题意:给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。($1 \leq n \leq 50, 0\leq a_i \leq 2^{50}$)

猜你喜欢

转载自www.cnblogs.com/lfri/p/11261660.html
今日推荐