过的第一道高斯消元题,继续加油。
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <list>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <functional>
#include <algorithm>
using namespace std;
const int maxn=30;
int Mat[maxn][maxn];
int sta[maxn],endd[maxn];
//the number of function is m
//the number of variable is n
int ranked(int mat[30][30],int m,int n)
{
int i=0,j=0,k,r,u;
while(i<m&&j<n)
{
r=i;
for(k=i;k<m;k++)
if(mat[k][j]) {r=k;break;}
if(mat[r][j])
{
if(r!=i) for(k=0;k<=n;k++) swap(mat[r][k],mat[i][k]);
for(u=i+1;u<m;u++)if(mat[u][j])
for(k=j;k<=n;k++)mat[u][k]^=mat[i][k];
i++;
}
j++;
}
//if the result is not 0, that means that there is no answer
for(j=i;j<m;j++)
if(mat[j][n]) return -1;
return i;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(Mat,0,sizeof(Mat));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&sta[i]);
for(int i=0;i<n;i++) scanf("%d",&endd[i]);
int u,v;
while(scanf("%d%d",&u,&v)!=EOF)
{
if(u==0&&v==0) break;
Mat[v-1][u-1]=1;
}
for(int i=0;i<n;i++) Mat[i][i]=1,Mat[i][n]=sta[i]^endd[i];
int res=ranked(Mat,n,n);
if(res==-1) printf("Oh,it's impossible~!!\n");
else printf("%d\n",1<<(n-res));
}
}