开关问题
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 8010   Accepted: 3161

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 (不记顺序)

Source

LIANGLIANG@POJ

代码:

 //初始状态^末状态就是要变换的状态,列出n个含有n个未知数的方程,方程解的个数就是2^(m),m是自由未知量的个数,
//因为自由未知量只能取0,1两个值。自由未知量的个数就是n-秩。如果操作第i个开关则第j个开关也会变化。由于增广矩阵
//最后一列就是要变换到的状态,所以矩阵第i列第i个数(0<=i<n)就是代表的i个开关按动,因为按动一个开关会引起其他
//开关的变化,所以将第i列与第i个开关相关联的第j个开关也按动即a[j][i]=1;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=;
int t,n,equ,var;
int a[MAX][MAX],x[MAX];
int st[MAX],en[MAX];
int gaos()
{
equ=var=n;
int k,col;
for(k=,col=;k<equ&&col<var;k++,col++)
{
int maxr=k;
for(int i=k+;i<equ;i++)
if(abs(a[i][col])>abs(a[maxr][col]))
maxr=i;
if(maxr!=k)
{
for(int i=col;i<var+;i++)
swap(a[k][i],a[maxr][i]);
}
if(a[k][col]==)
{
k--;
continue;
}
for(int i=k+;i<equ;i++)
{
if(a[i][col]!=)
{
for(int j=col;j<var+;j++)
a[i][j]^=a[k][j];
}
}
}
for(int i=k;i<equ;i++)
if(a[i][var]!=) return -;//无解,出现(0,0,0,0,0,a[i][var])的情况
return var-k;
}
int main()
{
int x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&st[i]);
for(int i=;i<n;i++)
scanf("%d",&en[i]);
memset(a,,sizeof(a));
while(scanf("%d%d",&x,&y)&&x&&y)
a[y-][x-]=; //注意
for(int i=;i<n;i++)
{
a[i][i]=;
a[i][n]=st[i]^en[i];
}
int ans=gaos();
if(ans==-) printf("Oh,it's impossible~!!\n");
else printf("%d\n",<<ans);
}
return ;
}

*POJ1830 高斯消元的更多相关文章

  1. BZOJ1013 + BZOJ1923 + POJ1830 (高斯消元)

    三个题放在一起写了 主要是搞搞模板 在这里简述一下怎么写高斯消元 就和代数里学的加减消元学的一样 把矩阵化为上三角形形式 然后进行回代 同时枚举当前要消元的未知数和当前化简到哪一行了 然后从这一行往后 ...

  2. poj1830(高斯消元解mod2方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...

  3. 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

    最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...

  4. 高斯消元处理无解|多解情况 poj1830

    高斯消元结束后,若存在系数为0,常数不为0的行,则方程无解 若系数不为0的行有k个,则说明主元有k个,自由元有n-k个,方程多解 /* 给定n个开关的初始状态si,要求将其变成目标状态di 规定: 每 ...

  5. [poj1830]开关问题(高斯消元)

    题意:求高斯消元中自由元的个数,输出1<<ans; #include<cstdio> #include<cstdlib> #include<cstring&g ...

  6. poj1830开关问题——异或高斯消元

    题目:http://poj.org/problem?id=1830 根据题意,构造出n元方程组: a(1,1)x1 ^ a(1,2)x2 ^ a(1,3)x3 ... a(1,n)xn = st1 ^ ...

  7. 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:// ...

  8. 0x35 高斯消元与线性空间

    颓了十天回来做题果然…… 感觉还是很有收获的,这两以前都没学过 bzoj1013: [JSOI2008]球形空间产生器sphere poj1830(upd) 之前做得很烂还被 D飞*2 了..重做一次 ...

  9. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

随机推荐

  1. ubuntu 配置VPN

    1.  sudo apt-get install pptpd 2.  修改/etc/pptpd.conf , vi /etc/pptpd.conf 找到#localip 192.168.0.1和#re ...

  2. Latex中插入C语言代码

    Latex是一个文本排版的语言,能排版出各种我们想要的效果.而且用代码排版的优点是易于修改板式,因此在文本内容的排版时,Latex应用十分广泛. 当我们需要在Latex中插入代码时,就需要用到 \us ...

  3. android 去掉actionbar 的虚线

    if(Build.VERSION.SDK_INT>=21){ getSupportActionBar().setElevation(0); }

  4. WPF如何控制每个窗体确保只打开一次

    在主窗体上点击菜单时,如果做到每个窗体不会被重复打开,如果打开了,可以将其重新获得焦点. 首先在主窗体中将菜单关联的窗体实例化. 第二步:将每个菜单对应窗体的closing事件重写.之所以要重写clo ...

  5. MongoDB的分片(9)

    什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里, ...

  6. expect命令问题1

    [root@localhost scripts]# cat exptest.sh #!/usr/bin/expect spawn ssh root@127.0.0.1 expect "pas ...

  7. Python,ElementTree模块处理XML时注释无法读取和保存的问题

    from xml.etree import ElementTree class CommentedTreeBuilder ( ElementTree.XMLTreeBuilder ): def __i ...

  8. Jquery判断变量是否为空

    var aaa=''; if(aaa) { //aaa不为空也不是不可识别对象时执行 } else { //aaa为空或不可识别时执行 } aaa必须是变量,对象的属性好像是不行,

  9. CozyRSS1.0 - 有可用性版本

    bin:还是不提供了,有兴趣的加QQ群373862115讨论 src:https://github.com/zpublic/cozy/tree/a202ae0944936c1ca56c2c3f4b73 ...

  10. 使用 ApacheBench 进行轻量级压力测试

    ApacheBench 是 Apache Http Server 附带的一个轻量级压力测试功能 先下载一个Apache Http Server :http://httpd.apache.org/ 解压 ...