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;
    }
    
  • 相关阅读:
    spring获取webapplicationcontext,applicationcontext几种方法详解(转)
    spring注入是否会被回收
    think in java 手记(一)
    spring 注解实例
    navicat远程连接oracle
    tomcat监听activemq jms配置
    HDU 1160:FatMouse's Speed
    YTU 2457: 很简单的一道题
    YTU 2456: 评委打分
    YTU 2455: Pefect 数字
  • 原文地址:https://www.cnblogs.com/akura/p/14383371.html
Copyright © 2011-2022 走看看