HDU 3949 XOR 高斯消元
题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少
首先高斯消元求出线性基,然后将k依照二进制拆分就可以
注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k--
然后HDU输出long long是用%I64d 不管C艹还是G艹都是
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 10100
using namespace std;
typedef long long ll;
int n,m,cnt;
bool zero;
ll a[M];
void Gaussian_Elimination()
{
int i,k=0;
ll j;
for(j=1ll<<62;j;j>>=1)
{
for(i=k+1;i<=n;i++)
if(a[i]&j)
break;
if(i==n+1)
continue;
swap(a[i],a[++k]);
for(i=1;i<=n;i++)
if(i!=k)
if(a[i]&j)
a[i]^=a[k];
}
zero=(k!=n);
n=k;
}
ll Query(ll x)
{
int i;
ll re=0;
x-=zero;
if(!x)
return 0;
for(i=n;i;i--)
{
if(x&1)re^=a[i];
x>>=1;
}
if(x)
return -1;
return re;
}
int main()
{
int T,i;
ll x;
for(cin>>T;T;T--)
{
printf("Case #%d:\n",++cnt);
cin>>n;
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
Gaussian_Elimination();
cin>>m;
for(i=1;i<=m;i++)
scanf("%I64d",&x),printf("%I64d\n", Query(x) );
}
}
posted on 2017-04-22 15:03 cynchanpin 阅读(174) 评论(0) 收藏 举报
浙公网安备 33010602011771号