线性基

下文记 \(f_{\max}(x),f_{\min}(x)\) 代表 \(x\) 和线性基中的元素进行异或操作得到的最大 / 最小值。

用高斯消元法求出来线性基,回顾我们求 \(f_{\min}(x)\) 的过程,考虑一组基向量 \(b_{1 \sim k}\),它们每个向量在二进制位下的最高位 \(p_{1 \sim k}\) 都不同,把这些位置称为关键位。考虑把一个数加入线性基时,从高往低比较每个基,如果 \(p_i\) 位是 \(1\) 就异或上这个向量,最后得到的向量就是最小的。

我们形式化写出来,那么有:

\[f_{\min}(x) = x \oplus \bigoplus_{i=1}^k (x_{p_i} \times b_i) \]

我们把 \(x \oplus y\) 带入这个公式:

\[f_{\min}(x \oplus y) = (x \oplus y) \oplus \bigoplus_{i=1}^k ((x_{p_i} \oplus y_{p_i}) \times b_i) \]

由于 \(x_{p_i},y_{p_i}\) 只有 \(0/1\),所以右边的乘法可以拆开,那么有结论:

\[\boxed{f_{\min}(x \oplus y) = f_{\min}(x) \oplus f_{\min}(y)} \]

同样我们考虑 \(f_{\max}(x)\),写出来形式化的式子:

\[f_{\max}(x) = x \oplus \bigoplus_{i=1}^k ((x_{p_i} \oplus 1)\times b_i) = x \oplus \bigoplus_{i=1}^k (x_{p_i} \times b_i) \oplus \bigoplus_{i=1}^k b_i \]

那么有第二个结论:

\[\boxed{f_{\max}(x) = f_{\max}(0) \oplus f_{\min}(x)} \]

那么是不是可以做 \(O(1)\) 查询两点间异或最短路,最长路了。

posted @ 2026-08-23 18:27  nullpt3  阅读(10)  评论(0)    收藏  举报