这个题目比赛的时候想了好久也没有想到方法,刚开始的时候就一直以为是数据结构里面的东西。题目的意思很好懂,在一堆数里挑出一些数,问是不是存在一种选择方法使得选出来的数的异或值为0。这个题目赛后看了题解。尽然是高斯消元法,判断高斯消元后的矩阵是不是存在全为0的行。如果存在,就是可以,否则不行。具体问什么这样做,还没有想清楚。o(╯□╰)o,先贴上代码吧。
#include<cstdio>
#include<algorithm>
#define MAX 1010
#define ll __int64
using namespace std;
int a[MAX][64],n;
int f(int c, ll x){
int u = 63;
while (x){
a[c][u] = x % 2;
x /= 2;
u--;
}
return u;
}
bool isf(int u){
for (int i = u,k = 0; i<64; i++,k++){
int j;
for (j = k; j<n; j++) if (a[j][i] == 1) break;
if (j >= n) continue;
if (j != k){ //交换第j行和第k行
for (int x = u; x < 64; x++)
swap(a[j][x],a[k][x]);
}
for (int x = k+1; x < n; x++) if (a[x][i] != 0){ //消元
for (int y = u; y<64; y++) a[x][y] = a[x][y] ^ a[k][y];
}
}
for (int x = 0; x<n; x++){
int ok = 1;
for (int y = u; y<64; y++) if (a[x][y]) ok = 0;
if (ok) return true;
}
return false;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ll t;
int res = 63;
for (int i = 0; i<n; i++){
scanf("%I64d",&t);
res = min(res,f(i,t));
}
if (isf(res+1)) printf("Yes\n");
else printf("No\n");
}
return 0;
}