其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了。

发现灯的操作情况顺序不影响结果,因为操作相当于在固定位进行xor运算,xor是可以随便交换的,所以顺序无所谓。

那么情况取决于每盏灯是否被操作过。设这个量为未知量$x_i$。于是可以设计方程,对于每个灯,有

$begin \text{xor} x_1 a_{1,1} \text{xor} x_2 a_{2,1} \text{xor} ... \text{xor} x_n a_{n,1} = end$

就是初始状态经过每一个灯对他的异或(这个异或是灯$i$是否操作乘上灯$i$是否影响这个灯,取$0/1$),最后得最终状态。

把$begin$初状态移到右边去。仿照高消内容,然后从第一个未知数开始消就行。

最后要问有多少种方案,也就是有多少个自由元可以随便取$0/1$,那答案就是$2^{自由元个数}$。否则全零系数的等式右边是$1$就无解。

感谢hkk上午给我讲无穷多解和无解的判断,不然我就要磕一下午了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
int A[],bin[];
int T,n,x,y,c,ans; int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
for(register int i=;i<=;++i)bin[i]=<<i;
read(T);while(T--){
read(n);ans=;
memset(A,,sizeof A);
for(register int i=;i<=n;++i)read(x),A[i]|=x<<n;
for(register int i=;i<=n;++i)read(x),A[i]^=x<<n;
while(read(x),read(y))A[y]|=bin[x-];
for(register int i=;i<=n;++i)A[i]|=bin[i-];
for(x=,c=;c<=n;++c){//dbg(c),dbg(x),dbg(A[x]);
for(y=x;y<=n&&!(bin[c-]&A[y]);++y);
if(y==n+)continue;
swap(A[x],A[y]);
for(register int l=;l<=n;++l)if((l^x)&&(A[l]&bin[c-]))A[l]^=A[x];
++x;
}
for(register int i=x;i<=n;++i){
if(A[i]&bin[n])ans=-;
else ++ans;
}
if(ans<)puts("Oh,it's impossible~!!");
else printf("%d\n",<<ans);
}
return ;
}

Upd:这种题也可以用暴力枚举加小技巧优化来做,lyd书上在比较开头的地方有提到(“费解的开关”这题),复杂度$O(nm2^m)$。

poj1830 开关问题[高斯消元]的更多相关文章

  1. POJ - 1681: Painter's Problem (开关问题-高斯消元)

    pro:开关问题,同上一题. 不过只要求输出最小的操作步数,无法完成输出“inf” sol:高斯消元的解对应的一组合法的最小操作步数. #include<bits/stdc++.h> #d ...

  2. POJ - 1222: EXTENDED LIGHTS OUT (开关问题-高斯消元)

    pro:给定5*6的灯的状态,如果我们按下一个灯的开关,它和周围4个都会改变状态.求一种合法状态,使得终状态全为关闭: sol:模2意义下的高斯消元. 终于自己手打了一个初级板子. #include& ...

  3. POJ 3185 The Water Bowls 【一维开关问题 高斯消元】

    任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  4. POJ1830开关问题——gauss消元

    题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...

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

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

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

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

  7. POJ 1830 开关问题 [高斯消元XOR]

    和上两题一样 Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状 ...

  8. POJ - 1830:开关问题 (开关问题-高斯消元-自由元)

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

  9. POJ.1830.开关问题(高斯消元 异或方程组)

    题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...

随机推荐

  1. 从gopath到go mod的一次尝试

    windows下的尝试: gomod初尝试下载官方包1.11(及其以上版本将会自动支持gomod) 默认GO111MODULE=auto(auto是指如果在gopath下不启用mod)go mod h ...

  2. JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)

    // 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...

  3. android webview 访问 https 页面

    在android 中利用webview 控件进行开发过程中,可能会遇到 webview 访问不了https://的页面如 https://www.google.com.hk 重写onReceivedS ...

  4. Bzoj2873 光之大陆

    https://blog.csdn.net/qq_39791208/article/details/79079117 有空来研究

  5. 解决pip安装第三方包编码错误:UnicodeDecodeError: 'ascii' codec can't decode byte....

    .../python27/Lib/mimetypes.py 在 import之后添加下列内容 if sys.getdefaultencoding() != 'gbk': reload(sys) sys ...

  6. 【机器学习】转导推理——Transductive Learning

    在统计学习中,转导推理(Transductive Inference)是一种通过观察特定的训练样本,进而预测特定的测试样本的方法.另一方面,归纳推理(Induction Inference)先从训练样 ...

  7. [转帖]Intro Guide to Dockerfile Best Practices

    Intro Guide to Dockerfile Best Practices By Tibor Vass July 02 2019    https://blog.docker.com/2019/ ...

  8. Ubuntu - Ubuntu应用记录(2)

    1.安装Ubuntu16.04的一种分区分案(240G固态硬盘小例) 1.创建boot分区(引导分区)-> 512M ->逻辑分区->空间起始位置->Ext4日志文件系统-&g ...

  9. 3. Linux的shell编程

    Shell 是一个用 C 语言编写的程序, 通过 Shell 用户可以访问操作系统内核服务.它类似于 DOS 下的 command 和后来的 cmd.exe.Shell 既是一种命令语言,又是一种程序 ...

  10. 比反射更快!使用ASM获取class信息(ClassReader)

    比反射更快!使用ASM获取class信息(ClassReader) 通常我们想要在java运行时获取class的信息时,通常使用反射的方式来获取其中的属性,方法,注解等信息.通常是这样的: Class ...