hdu3949xor(高斯消元)

原创 2016年08月28日 19:54:32

看了半天题,没想出怎么用高斯消元解题,看完别人ac明白。
首先,用二进制去看待每一个数,因为xor其实就是二进制的不进位加法。
比如 (十进制)2^0 2^1
1 1
2 1
3 1 1
其实3参与的xor可以用(1^2)代替,因为1 , 2 ,3线性相关。

所以需要做的就是求出这n个数的线性无关基,这是就是可以用高斯消元,但是要求的是第几小 ,所以希望每个消元后的数都尽量小,所以应该从高位开始消元
不理解可以看一下下边的数据(同样n个数不同姿势出来的结果)

//从高位消元
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
0
1
2
4
8
16
32
64
128
256
512
3072
9216
20480
66560
561152
//从低位开始消元
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 
0
1
2
4
8
16
32
64
128
256
512
66560
67584
73728
561152
573440
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <stack>
#include <vector>
#include <string.h>
#include <queue>
#define msc(X) memset(X,-1,sizeof(X))
#define ms(X) memset(X,0,sizeof(X))
typedef long long LL;
using namespace std;
LL a[10005];
int n;
//求第几小应该从最高位开始消元,这样保证了线性无关组元素和最小
void Guass(void)
{
    int max_r,col,k;
    for(k=0,col=60;k<n&&col>=0;col--)
    {
        max_r=k;
        for(int i=k+1;i<n;i++)
            if(a[i]&(1ll<<col)) {
                max_r=i;
                break;
            }
        if((a[max_r]&(1ll<<col))==0)
            continue;
        if(max_r!=k)
            swap(a[k],a[max_r]);
        for(int i=0;i<n;i++)
            if(i!=k&&(a[i]&(1ll<<col)))
                a[i]^=a[k];
        k++;
    }
    sort(a,a+n);
    n=unique(a,a+n)-a;
}
LL cal(LL k)
{
    LL ans=0;
    int i=0;
    if(a[0]==0){
        if(k==1) return 0;
        k--;
        i++;
    }
    for(;i<n&&k;k>>=1,i++)
        if(k&1)
            ans^=a[i];
    if(i==n&&k) return -1;
    return ans;
}
int main(int argc, char const *argv[])
{
    int t,ti=0;
    scanf("%d",&t);
    while(++ti<=t){
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%I64d",a+i);
        Guass();
        printf("Case #%d:\n",ti);
        int q;
        scanf("%d",&q);
        while(q--){
            LL k;
            scanf("%I64d",&k);
            printf("%I64d\n",cal(k) );
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[POJ2482]Stars in Your Window(离散化+扫描线+线段树)

任何值得拥有的东西,都值得等待。

【bzoj2460】【beijing2011】【元素】【线性基+贪心】

Description   相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术。那时人们就认识到,一个法杖的法力取决于使用的矿石。 一般地,...

hdu3949 XOR(求所有的异或和的第k小,高斯消元求线性基)

首先线性基很妙啊。可以来这里学习下:传送门 然后板子基本就是高斯消元?蒟蒻还不会高斯消元。。。待填坑。反正就是用log w级别的数,代替了原来的n个数。在什么意义上这两个东西相等呢?就是这log w...

hdu3949 XOR (线性基(高斯消元))

hdu3949 XOR 原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=3949题意: T组数据, 每组数据给n个数,m个询问,对于每个询问给出一个k...
  • Bfk_zr
  • Bfk_zr
  • 2017年12月03日 19:15
  • 22

HDU 3949 XOR [线性基|高斯消元]【数学】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 ——————————————————————————–. 碑商家客流量预测大赛》 XORT...

[高斯消元 线性基 二进制拆分] HDU 3949 XOR

意识流的记一个结论就好了 将K二进制拆分什么的 不难想 注意特判0 安利:http://hzwer.com/5491.html #include #include #include using n...

HDOJ-3949 XOR(高斯消元)

这道题卡了好长时间,终于解决了。网上的题解很多提到“XOR线性基”,然而并没有多少讲解的。 找学长讲了一遍,又找了点资料。终于过了。 强烈推荐下面的资料: http://blog.sina.co...

[BZOJ2115][Wc2011] Xor(dfs+高斯消元求线性基+贪心)

题目描述传送门题解挺好的一道思路题… 首先一条路径一定可以分解成一条简单路径和若干环的异或值 只需要dfs一遍所有能dfs到的环,剩余的环都可以通过其它的环组合(异或)得到 而简单路径可以是任意...

[省选前题目整理][POJ 1830]开关问题(XOR方程组高斯消元)

题目链接http://poj.org/problem?id=1830思路很好的一道题。。。 对于nn个开关,我们可以很容易地列出nn个nn元一次方程,每个方程如下: a1x1⊕a2x2⊕a3x3....
  • qpswwww
  • qpswwww
  • 2015年03月25日 14:27
  • 421

poj1222高斯消元解XOR方程

http://poj.org/problem?id=1222 题意:给定一个5×6的的矩阵,每次可以选择一个,使得它和四周的值翻转(开关变向),问怎样操作使得全为0. (PS:我交C++给我CE了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu3949xor(高斯消元)
举报原因:
原因补充:

(最多只允许输入30个字)