【知识点】线性基

定义

在 $ n $ 维的布尔集空间上,找到一组 $ n $ 维的基,其进行任意的异或操作可以拼出该布尔集空间的所有二进制数。

算法

算法的主要思想是高斯消元法,从高位开始,如果此位为 $ 1 $ 则尝试计入基,如果该位置已经有数字,则矩阵行变换消除首个 $ 1 $ ,这里的行变换采取的是异或的方式。所以,高斯消元法最终得到的基是一个 $ n * n $ 的行简化阶梯矩阵。

bool insert(i64 x) {
    for (int i = 18; i >= 0; i--)
        if ((x >> i) & 1){
            if (!p[i]){
                p[i] = x;
                return 1;
            }
            x ^= p[i];
        }
    return 0;
}

在主函数内,要从一些数中选出线性基,直接逐个 $ insert $ 即可。注意,保留的数字已经被异或过了,所以不一定是当前调用 $ insert $ 时传入的 $ x $, 如果需要保留原数字不做改动,需要另作一个数组来存储真正的基,而用 $ p $ 数组来判断能不能插入。

posted @ 2026-01-28 12:20  Alkaid16  阅读(2)  评论(0)    收藏  举报