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

  1. 2
  2. 3
  3. 0 0 0
  4. 1 1 1
  5. 1 2
  6. 1 3
  7. 2 1
  8. 2 3
  9. 3 1
  10. 3 2
  11. 0 0
  12. 3
  13. 0 0 0
  14. 1 0 1
  15. 1 2
  16. 2 1
  17. 0 0

Sample Output

  1. 4
  2. Oh,it's impossible~!!

Hint

第一组数据的说明:
一共以下四种方法:

操作开关1

操作开关2

操作开关3

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

  1. /**
  2. 题意:给一些开关,开某一个开关之后有的开关也会变化
  3. 做法:高斯消元 线性代数
  4. **/
  5. #include <iostream>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <algorithm>
  9. #include <cmath>
  10. #define maxn 50
  11. using namespace std;
  12. int mmap[maxn][maxn];
  13. int start[maxn];
  14. int eed[maxn];
  15. int guess(int equ,int val)
  16. {
  17. int k=,col = ;
  18. int max_r = ;
  19. for(k=; k<equ&&col<val; k++,col++)
  20. {
  21. max_r = k;
  22. for(int i=k+; i<equ; i++)
  23. {
  24. if(abs(mmap[i][col]) > abs(mmap[max_r][col]))
  25. {
  26. max_r = i;
  27. }
  28. }
  29. if(max_r != k)
  30. {
  31. for(int i=k; i<val+; i++)
  32. {
  33. swap(mmap[k][i],mmap[max_r][i]);
  34. }
  35. }
  36. if(mmap[k][col] == )
  37. {
  38. k--;
  39. continue;
  40. }
  41. for(int i=k+; i<equ; i++)
  42. {
  43. if(mmap[i][col] != )
  44. {
  45. for(int j=col; j<val+; j++)
  46. {
  47. mmap[i][j] ^= mmap[k][j];
  48. }
  49. }
  50. }
  51. }
  52. ///上三角
  53. for(int i=k; i<equ; i++)
  54. {
  55. if(mmap[i][col]!=) return -;
  56. }
  57. return val-k;
  58. }
  59. int main()
  60. {
  61. //#ifndef ONLINE_JUDGE
  62. // freopen("in.txt","r",stdin);
  63. //#endif // ONLINE_JUDGE
  64. int T;
  65. scanf("%d",&T);
  66. while(T--)
  67. {
  68. int n;
  69. scanf("%d",&n);
  70. memset(start,,sizeof(start));
  71. memset(eed,,sizeof(eed));
  72. for(int i=; i<n; i++)
  73. {
  74. scanf("%d",&start[i]);
  75. }
  76. for(int i=; i<n; i++)
  77. {
  78. scanf("%d",&eed[i]);
  79. }
  80. int u,v;
  81. memset(mmap,,sizeof(mmap));
  82. while(scanf("%d %d",&u,&v))
  83. {
  84. if(u == && v == ) break;
  85. u--;
  86. v--;
  87. mmap[v][u] = ;
  88. }
  89. for(int i=; i<n; i++)
  90. {
  91. mmap[i][i] = ;
  92. }
  93. for(int i=; i<n; i++)
  94. {
  95. mmap[i][n] = start[i]^eed[i];
  96. }
  97. int res = guess(n,n);
  98. if(res == -) printf("Oh,it's impossible~!!\n");
  99. else printf("%d\n",<<res);
  100. }
  101. return ;
  102. }

POJ-1830的更多相关文章

  1. 【POJ 1830】 开关问题 (高斯消元)

    开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为 ...

  2. POJ 1830 开关问题(高斯消元)题解

    思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态 ...

  3. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  4. POJ 1830 开关问题(高斯消元求解的情况)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8714   Accepted: 3424 Description ...

  5. 数学 --- 高斯消元 POJ 1830

    开关问题 Problem's Link: http://poj.org/problem?id=1830 Mean: 略 analyse: 增广矩阵:con[i][j]:若操作j,i的状态改变则con[ ...

  6. POJ 1830 开关问题 【01矩阵 高斯消元】

    任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...

  7. POJ 1830 开关问题 高斯消元,自由变量个数

    http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被 ...

  8. 【POJ 1830】 开关问题

    [题目链接] http://poj.org/problem?id=1830 [算法] 列出异或方程组,用高斯消元求解 [代码] #include <algorithm> #include ...

  9. POJ 1830 开关问题 (高斯消元)

    题目链接 题意:中文题,和上篇博客POJ 1222是一类题. 题解:如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择. 代码: #include <iostream> ...

  10. poj 1830 开关问题

    开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字 ...

随机推荐

  1. 「LibreOJ NOIP Round #1」七曜圣贤

    题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O ...

  2. Flex 布局教程:实例篇【转】

    Flex 布局教程:实例篇   作者: 阮一峰 日期: 2015年7月14日 原文:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html ...

  3. 【DP】【P1586】四方定理

    传送门 Description Input 第一行为一个整数T代表数据组数,之后T行每行一个数n代表要被分解的数 Output 对于每个n输出一行,为方案个数 Sample Input Sample ...

  4. 【树形DP】【P1364】医院放置

    传送门 Description 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接 ...

  5. mysql 主从同步 M-S 搭建

    主机: [root@ygy130 ~]# mysql -usystem -p123456 mysql> create database HA; mysql> use HA; mysql&g ...

  6. HDU1083 :Courses(二分图匹配)

    Cources Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. 转:PriorityQueue

    转自:PriorityQueue 本文github地址 Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地 分析 ...

  8. [SCOI2009]生日礼物

    https://www.luogu.org/problem/show?pid=2564 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x ...

  9. activemq依赖包获取

    现在项目中使用的是activemq-all.jar的jar,17M多,里面集成了日志.spring等相关的包.但项目启动时发现系统使用的是activemq包中的日志实现,没有用本项目的日志包.只能将整 ...

  10. c# socket select 模型代码(u3d)

    其实写过多次网络链接.但是因为换了工作,又没电脑在身边,所以以前的代码都没办法翻出来用. 所以从今天起,一些常用的代码只好放到网上. 公司有一个局域网的游戏.本来想用u3d的rpc就可以完成.但是后来 ...