其实第一反应是双向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)$。

最新文章

  1. 闰秒导致MySQL服务器的CPU sys过高
  2. MYSQL存储过程、游标、触发器
  3. Vi指令,随时追加
  4. bzoj 3110
  5. 用C++11的std::async代替线程的创建
  6. easyui-datagrid 报错:TypeError: col is null
  7. [tty与uart]1.Linux中tty框架与uart框架之间的调用关系剖析
  8. hust 1017 DLX
  9. jQuery的基本信息。以及入门Demo
  10. MVC-列表页操作按钮调用脚本
  11. park、unpark、ord 函数使用方法(转)
  12. C++使用模版技术将任意类型的数据转为某个类型的数据
  13. pfsense下的流量管理(转)
  14. go环境的安装~
  15. webstorm 设置uglify 压缩js文件
  16. 20160216.CCPP体系详解(0026天)
  17. Swift基础之init方法,实例方法,类方法(静态方法)的使用(多标签Demo)
  18. 加载XML文件到系统中
  19. 扒来的lstdc++.6.0.9有效解决方案
  20. Oracle in与exist条件分析

热门文章

  1. Python爬虫学习==&gt;第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
  2. mysql命令行备份方法
  3. DARTS代码分析(Pytorch)
  4. 记录Linq中lambda动态表达式的使用方式
  5. Js 原型,原型链
  6. Python全栈开发之2、数据类型-数值、字符串、列表、字典、元组和文件处理
  7. 【C++ 补习】Copy Control
  8. 【pytorch】学习笔记(三)-激励函数
  9. solr学习笔记-入门
  10. js注册实现