Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 5126 | Accepted: 1889 |
Description
Input
Output
Sample Input
2 3 0 0 0 1 1 1 1 2 1 3 2 1 2 3 3 1 3 2 0 0 3 0 0 0 1 0 1 1 2 2 1 0 0
Sample Output
4 Oh,it‘s impossible~!!
Hint
第一组数据的说明:操作开关1、2、3 (不记顺序)
通过高斯消元法计算自由元个数,对于每个自由元,有选与不选两种,所以答案为2的自由元的幂次,
代码:
/* *********************************************** Author :xianxingwuguan Created Time :2014/3/7 14:25:12 File Name :11.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=50; int a[maxn][maxn]; int x[maxn]; int free_x[maxn]; int Guass(int equ,int var){ int i,j,col,k; for(int i=0;i<=var;i++){ x[i]=0; free_x[i]=1; } for(k=0,col=0;k<equ&&col<var;k++,col++){ int max_r=k; for(i=k+1;i<equ;i++) if(abs(a[i][col])>abs(a[max_r][col]))max_r=i; if(max_r!=k){ for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]); } if(a[k][col]==0){ k--; continue; } for(i=k+1;i<equ;i++) if(a[i][col]){ for(j=col;j<var+1;j++) a[i][j]^=a[k][j]; } } for(i=k;i<equ;i++)if(a[i][col])return -1; return var-k; } int start[maxn],end[maxn]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int T,u,v,n; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d",&start[i]); for(int i=0;i<n;i++)scanf("%d",&end[i]); memset(a,0,sizeof(a)); while(~scanf("%d%d",&u,&v)&&(u||v))a[v-1][u-1]=1; for(int i=0;i<n;i++)a[i][i]=1; for(int i=0;i<n;i++)a[i][n]=start[i]^end[i]; int ans=Guass(n,n); if(ans==-1)printf("Oh,it‘s impossible~!!\n"); else printf("%d\n",1<<ans); } return 0; }
原文:http://blog.csdn.net/xianxingwuguan1/article/details/20717471