POJ 1830 开关问题 [高斯消元XOR]

和上两题一样

Input

输入第一行有一个数K,表示以下有K组测试数据。 
每组测试数据的格式如下: 
第一行 一个数N(0 < N < 29) 
第二行 N个0或者1的数,表示开始时N个开关状态。 
第三行 N个0或者1的数,表示操作结束后N个开关的状态。 
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。 

注意判断无解别把if放错位置
我的now表示当前该哪个方程组了,一开始是1确定一个变量就+1,答案应该是$2^{n-now+1}$才行
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,u,v;
bitset<N> a[N];
void ini(){for(int i=;i<=n;i++) a[i].reset();}
int now;
void Gauss(){
now=;
for(int i=;i<=n;i++){
int j=now;
while(j<=n&&!a[j][i]) j++;
if(j==n+) continue;
if(j!=now) swap(a[now],a[j]);
for(int k=;k<=n;k++)
if(k!=now&&a[k][i]) a[k]^=a[now];
now++;
}
}
int main(){
freopen("in","r",stdin);
int T=read();
while(T--){
n=read();
ini();
for(int i=;i<=n;i++) a[i][n+]=read();
for(int i=;i<=n;i++) a[i][n+]=a[i][n+]==read()?:;
for(int i=;i<=n;i++) a[i][i]=;
while(true){
u=read();v=read();
if(u==&&v==) break;
a[v][u]=;
}
Gauss();
int flag=;
//for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) printf("%d%c",a[i][j]==1,j==n+1?'\n':' ');
for(int i=;i<=n;i++)
if(a[i][n+]){
int f=;
for(int j=;j<=n;j++) if(a[i][j]==) f=;
if(f==){flag=;break;}
}
if(flag) puts("Oh,it's impossible~!!");
else printf("%d\n",<<(n-now+));
}
}
 
上一篇:centos 6.5下安装nmap工具及简单用法


下一篇:vncserver改变屏幕分辨率