解题报告: hdu 3949 - 线性基
#include <iostream>
#include <cstdio>
#define LL long long
using namespace std;
const int maxn = 10000;
LL a[maxn];
int n;
//返回row的值
int xorGauss()//可以用来解模二的方程,加快速度
{
int row = 0;
for (int i = 63; i >= 0; i--)
{
int j;
for (j = row; j < n; j++)
if(a[j]&((LL)1<<i))
break;
if (j != n)
{
swap(a[row], a[j]);
for (j = 0; j < n; j++)
{
if(j == row) continue;
if(a[j]&((LL)1<<i))
a[j] ^= a[row];
}
row++;
}
}
return row;
}
LL findK(int row, int k)
{
if(row < n)
{
if(k == 1)
return 0;
else
k--;
}
if(k >= (LL)1<<row)
{
return -1;
}
LL ans = 0;
// 把k二进制拆开来后,第i位就表示第i小的向量基取不取(1取,0不取)。
for(int i = 0 ; i < 6; i++) // bu tai dong
{
if(k&(LL)1<<i)
{
ans ^= a[row-1-i];
}
}
return ans;
}
void input()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
cin >> a[i];
}
void work()
{
int row, q;
LL k, ans;
row = xorGauss();
cin >> q;
for(int i = 0 ; i < q; i++)
{
cin >>k;
ans = findK(row,k);
cout << ans << endl;
}
}
int main()
{
int T;
cin >> T;
for(int times = 0; times < T; times++)
{
printf("Case #%d:\n", times+1);
input();
work();
}
return 0;
}
解题报告: hdu 3949 - 线性基的更多相关文章
- [hdu 3949]线性基+高斯消元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了. 之所以可以这样做,证明如下. 首 ...
- HDU - 3949 线性基应用
题意:求第\(k\)小的异或和 要点: 1.线性基能表示原数组的任意异或和,但不包括0,需特判(flag) 2.线性基中的异或组合只有\(2^{|B|}-1\)个,如果可以异或为0,则组合数为\(2^ ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- hdu 3949 XOR (线性基)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...
- HDU 3949 XOR 线性基
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...
- HDU 3949 XOR [高斯消元XOR 线性基]
3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...
- 【HDU 3949】 XOR (线性基,高斯消元)
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 3949 XOR [线性基|高斯消元]
目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...
- hdu 3949 XOR 线性基 第k小异或和
题目链接 题意 给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和. 思路 先求得线性基. 同上题,转化为求其线性基的子集的第k小异或和. 结论 记\(n\)个数的线性基为向量组\ ...
随机推荐
- Solidworks to Urdf to Sdf
. The urdf using tree form that does not support parallel robots (close loop robots). . The sdf usin ...
- artTemplate模板使用补充
1. 添加辅助方法 ``template.helper(name, callback)``辅助方法一般用来进行字符串替换,如 UBB 替换.脏话替换等. 例如扩展一个UBB替换方法: template ...
- 拖拽js和jq写法
第一种原生js写法 window.onload=function () { var oDrag=document.getElementById('drag'); oDrag.onmousedown=f ...
- HTML 之轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python [:-1] 与 [::-1]
line = "abcde"line[:-1]结果为:'abcd' line = "abcde"line[::-1]结果为:'edcba' [:-1] b = ...
- wireshark抓TCP包
tcpdump下载 如果要抓TCP数据包,我们可以使用TCPdump工具,类似于windows/linux下使用的这个工具一样.具体方法是 下载tcpdump, 还有个下载地址 详细使用请参考里面的文 ...
- [转]linux shell 获取当前正在执行脚本的绝对路径
原文链接:http://sexywp.com/bash-how-to-get-the-basepath-of-current-running-script.htm 常见的一种误区,是使用 pwd 命令 ...
- session和token的区别
session的使用方式是客户端cookie里存id,服务端session存用户数据,客户端访问服务端的时候,根据id找用户数据 而token一般翻译成令牌,一般是用于验证表明身份的数据或是别的口令数 ...
- 处理函数和数组声明[条款17]---《C++必知必会》
指向函数的指针声明和指向数组的指针声明容易混淆,原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号. int *f1( );//一个返回值为 int* 的函数 int ( ...
- find()函数
find()函数返回类型:size_type 1/S.find(T):返回T在S中第一次匹配的下标位置 2/S.find_first_of(T):返回字符串T第一个字符在S中第一次出现的下标位置 3/ ...