给定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行出现,即矩阵的秩小于矩阵的行数

普通的高斯消元复杂度数O(n3),其中一个n是矩阵的秩,一个n是矩阵行数,一个n是列数

那么异或空间的复杂度就是O(63*63*n),一个63为秩,一个63为列数,n为行数

  但实际上复杂度为O(63*n),因为异或运算可以把消元的复杂度从m改为1,即对于每行来说只要异或一次就行了

此外,求异或矩阵的主元时,要把除了主元位的其它位都清零,我自己做的时候由于没有清零主元两侧的位,wa了好多发,最后和网上的一对比

发现必须要清楚主元两侧的位

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
int t,n,q,rk;
ll k;
ll A[maxn],B[maxn],P[maxn];
void Gauss(int n)
{
memset(P,,sizeof(P));
for (int i=;i<=n;i++)
{
for (int j=;j>=;j--)
{
if ((A[i]>>j)&)
{
if (P[j]) A[i]^=P[j];//把这一列的清了
else {P[j]=A[i]; break;}//这行第j个作为主元,因为到第j位就退出了,所以后面的之后再清零
}
}
} for (int i=;i>=;i--)//把P[i]除了主元位的1之外的位(在主元右侧的1)清了
{
if (!P[i]) continue;
for (int j=i+;j<=;j++)
{
if ((P[j]>>i)&) P[j]^=P[i];
}
} rk=;
for (int j=;j<=;j++) if (P[j]) P[rk++]=P[j];
}
/*void Gauss(){
memset(P,0,sizeof P);
for(int i=1;i<=n;i++)
for(int j=63;j>=0;j--)
if((A[i]>>j) & 1){//判断A[i][j]==1
if(P[j]==0){P[j]=i;break;} //A[i][j]设为主元
else A[i]^=A[P[j]];//用其他主元把A[i][j]变成0
} for(int i=63;i>=0;i--){
if(!A[P[i]])continue;
for(int j=i+1;j<=62;j++)
if((A[P[j]]>>i)&1)A[P[j]]^=A[P[i]];
}
rk=0;
for(int j=0;j<=63;j++)//简化后的矩阵B,B[0]为at
if(A[P[j]])B[rk++]=A[P[j]];
}*/
int main(){
cin>>t;
for(int tt=;tt<=t;tt++){
printf("Case #%d:\n",tt); cin>>n;
for(int i=;i<=n;i++)cin>>A[i];
Gauss(n);//预处理构建矩阵
cin>>q;
while(q--){
cin>>k;
if(n!=rk)k--;//不能异或出0
if(k>=(1ll<<rk))puts("-1");
else {
ll ans=;
for(int j=;j<=;j++)//测试k的二进制位
if((k>>j)&)
ans^=P[j];
cout<<ans<<endl;
}
}
}
}

hdu3949 异或空间 + 求矩阵的主元的更多相关文章

  1. 异或空间求基(模板)——hdu3949

    输出样例有点问题的.. #include<bits/stdc++.h> using namespace std; #define ll unsigned long long #define ...

  2. PTA实验7-2-3 求矩阵的局部极大值 (15分)

    实验7-2-3 求矩阵的局部极大值 (15分) 给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值.本题要求给定矩阵的全 ...

  3. POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)

    求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...

  4. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  5. MATLAB中求矩阵非零元的坐标

    MATLAB中求矩阵非零元的坐标: 方法1: index=find(a); [i,j]=ind2sub(size(a),index); disp([i,j]) 方法2: [i,j]=find(a> ...

  6. POJ 1151 Atlantis 求矩阵面积并 扫描线 具体解释

    题意: 给定n个矩阵的左下角和右上角坐标,求矩阵面积并(矩阵总是正放的,即与x轴y轴都平行) 思路: 扫描线裸题 http://www.cnblogs.com/fenshen371/p/3214092 ...

  7. 求矩阵中各列数字的和 Exercise08_01

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵中各列数字的和 * */ public class Exercise ...

  8. 求矩阵主对角线元素的和 Exercise08_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵主对角线元素的和 * */ public class Exercis ...

  9. matlab求矩阵、向量的模

    求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...

随机推荐

  1. Javascript入门(二)变量、获取元素、操作元素

    一.变量 Javascript 有五种基本数据类型 number.String.boolean.undefined.null 一种复合类型:object 二.使用getElementById方法获取元 ...

  2. Centos7 nginx报错403 forbidden

    参考链接:http://www.cnblogs.com/chinway/archive/2017/08/14/7356239.html 因为安全性的考虑这个也是默认会出现的错误,因为SELinux的存 ...

  3. python - 字符编码/格式化/替换符

  4. JavaScript编程基础2

    1,数据类型相关操作 使用typeof x函数查看变量的数据类型: typeof "John" // 返回 string typeof 3.14 // 返回 number type ...

  5. 20165234 《Java程序设计》第六周学习总结

    第六周学习总结 教材学习内容总结 第八章 常用实用类 String类 Java专门提供了用来处理字符序列的 String 类.String类在java.lang包中,由于 java.lang 包中的类 ...

  6. 20165234 《Java程序设计》第一周学习总结

    第一周学习总结 教材学习内容总结 java的特点 语法简单,面向对象,稳定,与平台无关,多线程,动态. 平台是由操作系统和处理器(CPU)所构成,每个平台都会形成自己独特的机器指令,相同的CPU和不同 ...

  7. 老师博客copy

    新闻 管理   Py西游攻关之基础数据类型   数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频 ...

  8. CF1095E Almost Regular Bracket Sequence

    题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...

  9. 【转】MySQL— 基础

    [转]MySQL— 基础 目录 一.MySQL概述 二.下载安装 三.数据库操作 四.数据表操作 五.表内容操作 一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司 ...

  10. Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台

    Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud