题目链接:http://poj.org/problem?id=1830
代码:
#include <algorithm>
#include <cstdio>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 50;
typedef int Matrix[maxn][maxn];
Matrix A;
int n;
int Gauss(){
//i为行 j为列
int i,j,k,q;
for(i = 0,j = 0;i < n && j < n;++j){
k = i;
for(q = i + 1;q < n;++q)
if(A[q][j] > A[k][j]) k = q;
if(A[k][j]){
for(q = 0;q <= n;++q) swap(A[k][q],A[i][q]);
for(k = 0;k < n;++k){
if(k != i && A[k][j]){
for(q = 0;q <= n;++q) A[k][q] = A[k][q] ^ A[i][q];
}
}
i++;
}
}
for(j = i;j < n;++j)
if(A[j][n]) return -1;
return n - i;
}
int main(){
int T;sf("%d",&T);
while(T--){
sf("%d",&n);
memset(A,0,sizeof A);
for(int i = 0;i < n;++i) sf("%d",&A[i][n]);
for(int i = 0;i < n;++i){
int tmp;sf("%d",&tmp);
A[i][n] = A[i][n] ^ tmp;
A[i][i] = 1;
}
int u,v;
while(sf("%d %d",&u,&v),(u || v)){
u--,v--;
A[v][u] = 1;
}
int cnt = Gauss();
if(cnt != -1) pf("%d\n",1 << cnt);
else pf("Oh,it's impossible~!!\n");
}
}