POJ 1830 Gauss

View Code
  1 //Result:wizmann    1830    Accepted    736K    32MS    G++    1411B    2012-06-17 01:01:45
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <iostream>
  7 #include <bitset>
  8 
  9 using namespace std;
 10 
 11 #define print(x) cout<<x<<endl
 12 #define input(x) cin>>x
 13 #define SIZE 32
 14 
 15 int mat[SIZE][SIZE];
 16 int n;
 17 
 18 /*
 19 void printMatrix()
 20 {
 21     for(int i=0;i<n;i++)
 22     {
 23         for(int j=0;j<=n;j++)
 24         {
 25             printf("%d ",mat[i][j]);
 26         }
 27         puts("");
 28     }
 29     puts("");
 30 }
 31 * */
 32 
 33 int gauss()
 34 {
 35     int i,j;
 36     for(i=0,j=0;i<n&&j<n;j++)
 37     {
 38         int k=i;
 39         for(;k<n;k++)
 40         {
 41             if(mat[k][j]) break;
 42         }
 43         
 44         if(mat[k][j])
 45         {
 46             for(int l=j;l<=n;l++)
 47             {
 48                 swap(mat[i][l],mat[k][l]);
 49             }
 50             //printMatrix();
 51             for(int l=i+1;l<n;l++)
 52             {
 53                 if(l!=i && mat[l][j])
 54                 {
 55                     for(int r=j;r<=n;r++)
 56                     {
 57                         mat[l][r]^=mat[i][r];
 58                     }
 59                 }
 60             }
 61             i++;
 62         }
 63     }
 64     for(int k=i;k<n;k++)
 65     {
 66         if(mat[k][n]) return -1;
 67     }
 68     return 1<<(n-i);
 69 }
 70 
 71 int main()
 72 {
 73     freopen("input.txt","r",stdin);
 74     int T;
 75     input(T);
 76     int start[SIZE],end[SIZE];
 77     while(T--)
 78     {
 79         int a,b;
 80         input(n);
 81         memset(mat,0,sizeof(mat));
 82         for(int i=0;i<n;i++) input(start[i]);
 83         for(int i=0;i<n;i++) input(end[i]);
 84         for(int i=0;i<n;i++) start[i]^=end[i];
 85         while(input(a>>b) && a+b)
 86         {
 87             mat[b-1][a-1]=1;
 88         }
 89         for(int i=0;i<n;i++)
 90         {
 91             mat[i][n]=start[i];
 92             mat[i][i]=1;
 93         }
 94         int res=gauss();
 95         if(res==-1) print("Oh,it's impossible~!!");
 96         else print(res);
 97     }
 98     return 0;
 99 }
100         

posted on 2012-06-17 01:06  Wizmann  阅读(137)  评论(0)    收藏  举报

导航