题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949

一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了。

之所以可以这样做,证明如下。

  首先,把线性基做出来肯定是没有问题的,因为线性基的值域跟原来的n个数的值域是一样的。

  那么为什么不可以直接用原始的线性基做呢?因为,假设我加入数的顺序是1111,0111,0011,0001(二进制),那么形成的线性基是这样的:

  这是正常的形成线性基的算法,但是会发现,他们的异或和是杂乱无章的,没很难找到序关系的规律。但是如果我们对这个线性基进行一些高斯消元,变成这样:

  序关系就比较显然了,第i大的数,跟i的二进制表示是一一对应的。当然这个比较特殊,事实上高斯消元以后也许会是这样的:

  事实上我们可以证明这个第i大的数,跟i的二进制表示也是一一对应的。假设i>j,那么用i选出来的一组数的异或和,肯定比j选出来的一组数的异或和大。(因为必然存在某一个二进制位,之前的都相等,这一位i是1,j是0,那么选到的这个数就会导致最后的异或和这一位是1)

//http://acm.hdu.edu.cn/showproblem.php?pid=3949
#include<bits/stdc++.h>
using namespace std; typedef long long ll; vector<ll> base;
bool insert(ll x)
{
for (int i=;i<base.size();i++) x=min(x,x^base[i]);
if (x) base.push_back(x);
else return true;
return false;
} int main()
{
int t;
scanf("%d",&t);
for (int cas=;cas<=t;cas++)
{
base.clear();
int n;
scanf("%d",&n);
bool flag=false;
for (int i=;i<=n;i++)
{
ll x;
scanf("%I64d",&x);
flag|=insert(x);
}
sort(base.begin(),base.end());
for (int i=base.size()-;i>=;i--)
{
for (int j=i+;j<base.size();j++)
{
base[j]=min(base[j],base[j]^base[i]);
}
}
int q;
scanf("%d",&q);
printf("Case #%d:\n",cas);
while (q--)
{
ll k;
scanf("%I64d",&k);
if (flag) k--;
if (k>=(1ll<<base.size())) printf("-1\n");
else
{
ll ans=;
for (int i=;i<base.size();i++)
{
if (k&(1ll<<i)) ans^=base[i];
}
printf("%I64d\n",ans);
}
}
}
return ;
}

[hdu 3949]线性基+高斯消元的更多相关文章

  1. [bzoj 2844]线性基+高斯消元

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2844 又用到线性基+高斯消元的套路题了,因为经过高斯消元以后的线性基有非常好的序关系,所以 ...

  2. HDU 3949 XOR(高斯消元搞基)

    HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...

  3. HDU 3949 XOR(高斯消元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意:给出一个长度为n的数列A.选出A的所有子集(除空集外)进行抑或得到2^n-1个数字,去重排 ...

  4. Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)

    题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...

  5. 【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

    bzoj1923,戳我戳我 Solution: 这个高斯消元/线性基很好看出来,主要是判断在第K 次统计结束后就可以确定唯一解的地方和\(bitset\)的骚操作 (我用的线性基)判断位置,我们可以每 ...

  6. 洛谷P3265 [JLOI2015]装备购买(线性基+高斯消元)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 不难看出题目讲的就是线性基 这种最小化权值的问题一般都是贪心的,就是按价值从低到高考虑每一个是否能选 据说贪心的证明得用拟阵我不会 据说这题是实数意 ...

  7. 【bzoj4004】【JLOI2015】装备购买 (线性基+高斯消元)

    Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 < ...

  8. HDU 3949 XOR [线性基|高斯消元]

    目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...

  9. BZOJ 3105 线性基 高斯消元

    思路: 按照从大到小排个序 维护两个数组 一个是消元后的 另一个是 按照消元的位置排的 不断 维护从大到小 (呃具体见代码) //By SiriusRen #include <cstdio> ...

随机推荐

  1. Python学习手册之数据类型

    在上一篇文章中,我们介绍了 Python 的异常和文件,现在我们介绍 Python 中的数据类型. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/99799 ...

  2. FPGA算法学习(1) -- Cordic(圆周系统之向量模式)

    旋转模式用来解决三角函数,实现极坐标到直角坐标的转换,基础理论请参考Cordic算法--圆周系统之旋转模式.那么,向量模式则用来解决反三角函数的问题,体现的应用主要是直角坐标向极坐标转换,即已知一点的 ...

  3. Java8新特性(二)——强大的Stream API

    一.强大的Stream API 除了Lambda表达式外,Java8另外一项重大更新便是位于java.util.stream.*下的Stream API Stream 是 Java8 中处理集合的关键 ...

  4. Xcode9新变化

    http://www.cnblogs.com/lurenq/archive/2017/09/26/7594909.html

  5. P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    P1215 [USACO1.4]母亲的牛奶 Mother's Milk 题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满 ...

  6. spring+springmvc+maven+mongodb

    1.前言 最近项目开发使用到了spring+springmvc+maven+mongodb,项目中的框架是用springboot进项开发的,对于我们中级开发人员来说,有利有弊,好处呢是springbo ...

  7. 用mapreduce读取hdfs数据到hbase上

    hdfs数据到hbase过程 将HDFS上的文件中的数据导入到hbase中 实现上面的需求也有两种办法,一种是自定义mr,一种是使用hbase提供好的import工具 hbase先创建好表   cre ...

  8. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  9. 对mysqlbinlog日志进行操作的总结包括 启用,过期自动删除

    操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs  产生一个新的binl ...

  10. 从webview中加载assets中的html文件

    private void readHtmlFormAssets(){ WebSettings webSettings = tipsWebView.getSettings(); webSettings. ...