zoukankan      html  css  js  c++  java
  • 线性基学习笔记

    根据线代常识,(n)维欧几里得空间中的(n)(n)维向量((k leq n))可以唯一地表示(n)维空间中的任意一个向量。根据定义,基底中的向量线性无关,并且不存在(0)。然后我们很容易有一种基于高斯消元求基底求法。

    假设我们现在已经构造出了(n)维基底的前(m)个向量,且第(i)个向量(vec{a})为:(egin{bmatrix}a_{i,1}, a_{i,2},cdots,a_{i,n}end{bmatrix}),考虑加入第(m+1)个。那我们如果能构造出一个向量(egin{bmatrix}x_1, x_2,cdots,x_nend{bmatrix})满足:

    [egin{bmatrix}x_1, x_2,cdots,x_mend{bmatrix} imes egin{bmatrix}a_{1,1}, a_{1,2},cdots,a_{1,n} \ a_{2,1}, a_{2,2},cdots,a_{2,n} \ cdots \ a_{m,1}, a_{m,2},cdots,a_{m,n} end{bmatrix} = egin{bmatrix}a_{m+1,1}, a_{m+1,2},cdots,a_{m+1,n}end{bmatrix} ]

    那么第(m+1)个向量就线性相关了。否则我们就可以把它加入基底中。这样的复杂度是(O(n^4))的。


    很显然向量的运算定义在取模的域中依然适用。随之产生的就是模(2)域下的基底,一般称之为线性基

    考虑把一组基底转化为上三角矩阵。这在一般情况下意义不大,但对线性基而言却有一些优美的性质。由于模(2)意义下的向量加法可以看成是两个非负整数的异或,上三角矩阵就意味着:(n)维线性基对应的(n)个整数中,两两二进制的最高位不同。因此我们往线性基中加入一个整数时,只需要看这个整数的最高位在线性基中出现过没有,如果没有,那就直接加入之;如果有,那就异或上线性基中这个整数,转化为最高位更低的子问题。这样构造线性基的复杂度是(O(n^2))的,(n)为维数。由于一般整数不会超过(2^{64}),所以(n<64)

    根据上三角矩阵的优美性质和贪心思想,我们可以用线性基求解集合中异或和的最大值问题。

    il LL calc(cn base &bas, LL res = 0){
    	fb(i, 59, 0)if(bas.vec[i] && !(res>>i&1))res ^= bas.vec[i];
    	return res;
    }
    
  • 相关阅读:
    Linux下tty/pty/pts/ptmx详解
    ubuntu 12 或更高版本 下安装和配置 xrdp 远程登陆
    ubuntu+apache2+php5+mysql5.0的安装
    Ubuntu SSH 服务安装配置和使用
    ubuntu 12.10 进入命令行界面 (字符界面)
    ubuntu 下使用 cron 和 crontab
    Ubuntu用命令行发邮件mutt,报警发短信通知
    Ubuntu 安装 proftpd,并添加虚拟用户
    绝对有效的 ubuntu 12.xx 下 apache2 + svn 安装和配置方法
    添加android系统通知
  • 原文地址:https://www.cnblogs.com/akura/p/14383371.html
Copyright © 2011-2022 走看看