poj1830开关问题

【题意】

  与poj1222类似,只不过关系不再是通过矩阵体现,而是直接给出。

【题解】

  根据关系建立出方程组,再高斯消元。若求出变元个数为num,答案即等于2^num。若解方程时有一个方程未知数系数为0,常数不为0,则是无解。

【代码】

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 struct node
 6 {
 7     int vec[31],c;
 8 }a[31];
 9 int T,n,x,y,ans;
10 int gauss()
11 {
12     int po;
13     for (int i=1,o=1;o<=n;)
14     {
15         for (int j=i;j<=n;++j)
16             if (a[j].vec[o])
17             {
18                 swap(a[i],a[j]);
19                 break;
20             }
21         if (!a[i].vec[o])
22         {
23             ++o;
24             continue;
25         }
26         for (int j=i+1;j<=n;++j)
27             if (a[j].vec[o])
28             {
29                 if (a[i].c)    a[j].c^=1;
30                 for (int k=o;k<=n;++k)
31                     if (a[i].vec[k])    a[j].vec[k]^=1;
32             }
33         ++i;++o;po=i;
34     }
35     ans=1;
36     for (int i=po;i<=n;++i)
37         if (a[i].c)    return -1;
38         else ans<<=1;
39     return ans;
40 }
41 int main()
42 {
43     scanf("%d",&T);
44     while (T--)
45     {
46         scanf("%d",&n);
47         memset(a,0,sizeof(a));
48         for (int i=1;i<=n;++i)    scanf("%d",&a[i].c);
49         for (int i=1;i<=n;++i)
50         {
51             scanf("%d",&x);
52             a[i].c^=x;
53             a[i].vec[i]=1;
54         }
55         while(1)
56         {
57             scanf("%d%d",&x,&y);
58             if (!x||!y)    break;
59             a[y].vec[x]=1;
60         }
61         ans=gauss();
62         if (ans==-1)    puts("Oh,it‘s impossible~!!");
63         else    printf("%d\n",ans);
64     }
65     return 0;
66 }

时间: 2024-10-12 07:29:24

poj1830开关问题的相关文章

POJ1830开关问题——gauss消元

题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转换次数. 题目仅仅和操作次数的奇偶有关,所以用0.1表示之后,对于每一个开关的转换次数就已经知道了.所以仅仅有一个未知量.能够线性表示.练习使用模板 const int maxn = 40; int a[maxn][maxn]; int gauss(int N, int M) { int r, c,

[POJ1830]开关问题(高斯消元,异或方程组)

题目链接:http://poj.org/problem?id=1830 题意:中文题面,求的是方案数. 首先可以知道, 如果方案数不止一个的话,说明矩阵行列式值为0,即存在自由变元,由于变量只有两种状态,那么方案数就是2^自由变元数. 从起始状态到终止状态,只需要关心起始和终止哪些状态不一样就行,也就是翻转奇数次. 由于是倒推,所以开关的影响要反过来存. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long lon

[Gauss]POJ1830 开关问题

中文题 题意不多说 这题乍一看 就是求个自由未知量个数 相当简单 其实呢 其中要注意的细节还是很多的: 1.光求了自由未知量个数 还不够 ∵求的是可行方案的总数  因此 答案是 2^(自由未知量个数) 2.此题转化成方程组比较麻烦 给了初始状态和最终状态 : ∵对于任意一个开关,最多只能进行一次开关操作. ∴此开关的初始状态与最终状态不同(即异或)就需进行操作 3.还有一个坑! 操作第 I 个开关,第J个开关的状态也会变化. 应将a[J-1][I-1]置1 而非a[I-1][J-1]     (

poj1830 开关问题

记 \(a_{i,j}\) 表示第 \(j\) 个开关对第 \(i\) 号开关产生的影响,\(x_i\) 为对第 \(i\) 个开关的操作,则 \[\begin{cases} a_{1,1}x_1\ \mathrm{xor}\ a_{1,2}x_2\ \mathrm{xor}\ \cdots\ \mathrm{xor}\ a_{1,n}x_n=start_1 \ \mathrm{xor}\ end_1 \a_{2,1}x_1\ \mathrm{xor}\ a_{2,2}x_2\ \mathrm{

Poj1830开关问题,高斯消元

高斯消元的入门题. #include<iostream> #include<cstdio> #include<cstring> #include<map> #include<vector> #include<stdlib.h> using namespace std; int Map[100][100]; int gauss(int equ, int var) { int k; int col; for (k = 0, col = 0

高斯消元求解异或方程组

POJ1830 开关问题 对于解异或方程组,系数可以采用二进制压缩,如果系数太多可以使用bitset,但是如果少一点就可以使用下述的写法,更加简单快速 使用bitset的写法更正常的没什么区别,只是对应的消除变为异或操作,另外行变换也会更加简单 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[100

【POJ1830】开关问题 高斯消元求自由元

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43482357"); } 题意:中文题. 题解: 呃,求自由元个数,然后输出1<<ans:(自由元就是高斯消元消某个变量x时发现以下所有方程当前此位系数都是0) 如果无解输出那个题中给的串. 诶网上代码真不可看,我绝望了决定照自己

基于Redis bitmap实现开关配置功能

作者:zhanhailiang 日期:2014-12-21 bitmap api SETBIT key offset value 对key所储存的字符串值,设置或清除指定偏移量上的位(bit). 位的设置或清除取决于value参数,可以是0也可以是1. 当key不存在时,自动生成一个新的字符串值. 字符串会进行伸展(grown)以确保它可以将value保存在指定的偏移量上. 当字符串值进行伸展时,空白位置以0填充. offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB之内

开关中断与cpsid/cpsie指令

在汇编代码中,CPSID   CPSIE  用于快速的开关中断. CPSID I ;PRIMASK=1, ;关中断 CPSIE I ;PRIMASK=0, ;开中断 CPSID CPSIE F F ;FAULTMASK=1, ;FAULTMASK=0 ;关异常 ;开异常 I:IRQ中断;    F:FIQ中断 最常见的这两个命令的使用处是在关中断.开中断的实现中,我们经常用的local_irq_save和local_irq_restore最终都是调用了以下两个实现,即关/开中断只是操作了CP