题目分析:
注意:有个地方要反过来
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=110; int a[maxn][maxn]; int n,a1[maxn],a2[maxn]; inline int fab(int x) { return x>0?x:-x; } inline void swap(int &x,int &y) { int temp=x; x=y; y=temp; } int Gauss() { int i,j,k,max_r,t; for(i=0,j=0;i<n&&j<n;i++,j++) { max_r=i; for(k=i+1;k<n;k++) if(fab(a[k][j])>fab(a[max_r][j])) max_r=k; if(max_r!=i) { for(t=j;t<=n;t++) swap(a[i][t],a[max_r][t]); } if(a[i][j]==0) { i--; continue; } for(k=i+1;k<n;k++) { /* if(a[k][j]!=0) { for(t=j;t<n+1;t++) a[k][t]=a[k][t]^a[i][t]; }*/ if(a[k][j]==0) continue; for(t=j;t<=n;t++) a[k][t]=a[k][t]^a[i][t]; } } for(k=i;k<n;k++)//无解 if(a[k][n]!=0) return -1; if(i==n)//唯一解 return 1; return 1<<(n-i);//有n-i个未知变量 } int main() { int k,i;//int k,n,i; scanf("%d",&k); while(k--) { scanf("%d",&n); memset(a,0,sizeof(a)); for(i=0;i<n;i++) scanf("%d",&a1[i]); for(i=0;i<n;i++) scanf("%d",&a2[i]); int y,z; while(scanf("%d %d",&y,&z)&&(y||z)) { a[z-1][y-1]=1;//a[y-1][z-1]=1;会错滴!!! } for(i=0;i<n;i++) { a[i][i]=1; a[i][n]=a1[i]^a2[i];//why??? /*if(a1[i]!=a2[i]) a[i][n]=1; else a[i][n]=0;*/ } int ans=Gauss(); if(ans==-1) printf("Oh,it's impossible~!!\n"); else printf("%d\n",ans); } system("pause"); return 0; }