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{xor}\ \cdots\ \mathrm{xor}\ a_{2,n}x_n=start_2 \ \mathrm{xor}\ end_2 \\cdots \a_{n,1}x_1\ \mathrm{xor}\ a_{n,2}x_2\ \mathrm{xor}\ \cdots\ \mathrm{xor}\ a_{n,n}x_n=start_n \ \mathrm{xor}\ end_n \\end{cases}\]

解就是了

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T, a[35], sta, end, n, uu, vv;
int gauss(){
    for(int i=1; i<=n; i++){
        int maxi=i;
        for(int j=i+1; j<=n; j++)
            if(a[j]>a[maxi])
                maxi = j;
        swap(a[maxi], a[i]);
        if(a[i]==0) return 1<<(n-i+1);
        if(a[i]==1) return -1;
        for(int j=n; j; j--)
            if(a[i]&(1<<j)){
                for(int k=1; k<=n; k++)
                    if(k!=i && a[k]&(1<<j))
                        a[k] ^= a[i];
                break;
            }
    }
    return 1;
}
int main(){
    cin>>T;
    while(T--){
        memset(a, 0, sizeof(a));
        sta = end = 0;
        scanf("%d", &n);
        for(int i=1; i<=n; i++){
            scanf("%d", &uu);
            a[i] ^= uu;
        }
        for(int i=1; i<=n; i++){
            scanf("%d", &uu);
            a[i] ^= uu;
            a[i] |= 1<<i;
        }
        while(scanf("%d %d", &uu, &vv)!=EOF){
            if(!uu && !vv)  break;
            a[vv] |= 1<<uu;
        }
        int re=gauss();
        if(re<0)    printf("Oh,it‘s impossible~!!\n");
        else    printf("%d\n", re);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/poorpool/p/8520357.html

时间: 2024-08-03 02:00:48

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开关问题,高斯消元

高斯消元的入门题. #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开关问题

[题意] 与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],

高斯消元求解异或方程组

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