将数拆分成二进制位 从高往低枚举答案的二进制位 看是否能为1
注意 枚举到第几位就考虑到第几个方程
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define MAXN 100
#define MAXM 64
typedef long long LL;
int T[MAXM+10][MAXN+10];
int Ans[MAXM+10];
template <int maxn, int maxm>
struct Maxtrix{
int equ, var;
int A[maxn+10][maxm+10];
void init() { memset(A, 0, sizeof(A)); equ = var = 0; }
int Gauss() {
int row, col;
for(row = 0, col = 0; row < equ && col < var; row++, col++)
{
int r = row;
for(int i = r; i < equ; i++)
if(A[i][col])
{
r = i;
break;
}
if(r != row) for(int i = 0; i <= var; i++) swap(A[r][i], A[row][i]);
if(A[row][col] == 0) {
row--;
continue;
}
for(int i = row+1; i < equ; i++)
{
if(i == row) continue;
if(A[i][col] == 0) continue;
for(int j = col; j <= var; j++)
A[i][j] ^= A[row][j];
}
}
for(int i = row; i < equ; i++)
if(A[i][var])
return 0;
return 1;
}
};
Maxtrix <MAXM, MAXN> A;
void Div(LL x, int pos)
{
for(int i = 63; i >= 0; i--)
{
if(x & 1) T[i][pos] = 1;
x >>= 1;
}
}
int main()
{
int n;
while(scanf("%d", &n) == 1)
{
memset(T, 0, sizeof(T));
for(int i = 0; i < n; i++)
{
LL x;
cin >> x;
Div(x, i);
}
A.init();
A.equ = 64;
A.var = n;
LL ans = 0;
for(int i = 0; i <= 63; i++)
{
memcpy(A.A, T, sizeof(T));
A.A[i][n] = 1;
A.equ = i+1;
if(!A.Gauss()) {
A.A[i][n] = 0;
continue;
}
Ans[i] = 1;
T[i][n] = 1;
}
for(int i = 0; i <= 63; i++)
ans = (ans << 1) | Ans[i];
cout << ans;
}
}
/*
3
11 9 5
1011
1001
0101
14
1110
*/