给定n个整数,将数分解成01序列,由这n个01序列构成矩阵,这n个数构成线性空间,这就是异或空间
将这个矩阵高斯消元,求出t个主元,那么由着t个主元构成的线性空间里总共有2^t个数
设这t个数分别是a1,a2,a3,a4,...at,每个数代表的主元为二进制上的一位1,显然选a1的情况组成的数,必定比不选a1的情况组成的数要大
比如a1...a5转换成二进制后将主元取出来就是 1 1 1 1 1
那么异或空间中,(为了对应整齐,将第1小的数改为第0小,依次类推)
最小(0)的数就是 0 0 0 0 0即一个也不取,
第二(1)小的数就是0 0 0 0 1,即只取a5的情况
第三(2)小的数就是0 0 0 1 0,即只取a4的情况
第四(3)小的数就是 0 0 0 1 1,即取a4,a5的情况
显而易见 ,第k大的数对应的取法就是k的二进制表示中为1的位!
那么异或空间中最大数(2^t-1)显然是所有数的异或(把每一位都异或为1的情况),最小数(0)就是一个也不取的情况(0)
那么第k大的数就是将k-1 (把k-1为了方便从最小的数开始算起)进行二进制分解,然后取出对应的ai进行异或即可
但是本题中可能存在最小的数(0)不存在的情况:因为不允许xi ^ xi的情况
所以如果给定的数组a不能异或出0的值,就把k-1再加1即可,反之就用k-1进行二进制分解
如何判断能否异或出0的情况?高斯消元后是否有0行出现,即矩阵的秩小于矩阵的行数
原文:https://www.cnblogs.com/zsben991126/p/10533963.html