Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 6294   Accepted: 2393

Description

有 N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关 的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一 次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

Input

输入第一行有一个数K,表示以下有K组测试数据。
每组测试数据的格式如下:

第一行 一个数N(0 < N < 29)

第二行 N个0或者1的数,表示开始时N个开关状态。

第三行 N个0或者1的数,表示操作结束后N个开关的状态。

接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。

Output

如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号

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

操作开关1、2、3 (不记顺序)

/**
题意:给一些开关,开某一个开关之后有的开关也会变化
做法:高斯消元 线性代数
**/
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#define maxn 50
using namespace std;
int mmap[maxn][maxn];
int start[maxn];
int eed[maxn];
int guess(int equ,int val)
{
int k=,col = ;
int max_r = ;
for(k=; k<equ&&col<val; k++,col++)
{
max_r = k;
for(int i=k+; i<equ; i++)
{
if(abs(mmap[i][col]) > abs(mmap[max_r][col]))
{
max_r = i;
}
}
if(max_r != k)
{
for(int i=k; i<val+; i++)
{
swap(mmap[k][i],mmap[max_r][i]);
}
}
if(mmap[k][col] == )
{
k--;
continue;
}
for(int i=k+; i<equ; i++)
{
if(mmap[i][col] != )
{
for(int j=col; j<val+; j++)
{
mmap[i][j] ^= mmap[k][j];
}
}
}
}
///上三角
for(int i=k; i<equ; i++)
{
if(mmap[i][col]!=) return -;
}
return val-k;
}
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("in.txt","r",stdin);
//#endif // ONLINE_JUDGE
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
memset(start,,sizeof(start));
memset(eed,,sizeof(eed));
for(int i=; i<n; i++)
{
scanf("%d",&start[i]);
}
for(int i=; i<n; i++)
{
scanf("%d",&eed[i]);
}
int u,v;
memset(mmap,,sizeof(mmap));
while(scanf("%d %d",&u,&v))
{
if(u == && v == ) break;
u--;
v--;
mmap[v][u] = ;
}
for(int i=; i<n; i++)
{
mmap[i][i] = ;
}
for(int i=; i<n; i++)
{
mmap[i][n] = start[i]^eed[i];
}
int res = guess(n,n);
if(res == -) printf("Oh,it's impossible~!!\n");
else printf("%d\n",<<res);
}
return ;
}

最新文章

  1. 3、C#核心编程结构下
  2. 进程间通信 System V 消息队列
  3. OD使用教程7
  4. Sublime Text 必备插件
  5. 微信开发时遇到的UrlConnection乱码的问题
  6. js面形对象(2)
  7. KKCapture 高清录像软
  8. mysql用户权限分配及主从同步复制
  9. js的各种错误类型
  10. List与Linkedlist、Arrylist、Vector、Map应用
  11. A+B problem (High-precision)
  12. MySql数据and高级查询
  13. 五.ssh远程管理服务
  14. Wordpress 之删除 RSS 功能 的&quot;文章RSS&quot;、&quot;评论RSS&quot;、&quot;WordPress.org&quot;
  15. visio2013激活软件
  16. 验证码之SimpleCaptcha (二)
  17. 电子地图/卫星地图下载并转存为jpg图片
  18. 一起做RGB-D SLAM(7) (完结篇)
  19. bootstrap fileinput +springmvc图片上传-krajee
  20. 两个java小练习

热门文章

  1. BZOJ2005:[Noi2010]能量采集——题解
  2. linux 文件检索操作
  3. 【数论数学】【P2152】【SDOI2009】Super GCD
  4. JavaScript是没有域的限制
  5. [zz]【整理】Python中Cookie的处理:自动处理Cookie,保存为Cookie文件,从文件载入Cookie
  6. Generating Sets 贪心
  7. c# 深拷贝与浅拷贝的区别分析及实例
  8. [技巧篇]10.那些年我们一起优化过的MyEclipse8.6
  9. matlab求一个矩阵中各元素出现的个数(归一化)
  10. linux包安装,解压,压缩,包管理,环境变量