pro:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

sol:即求自由元的个数,答案是pow(2,自由元)。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[][],ans[];
int Guass(int N)
{
int res=;
rep(i,,N-){
int mark=i;
rep(j,i+,N-) if(abs(a[j][i])>abs(a[mark][i])) mark=j;
if(mark!=i) rep(j,,N) swap(a[i][j],a[mark][j]);
if(!a[i][i]){ res++; continue;} //自由元
rep(j,i+,N){
if(!a[j][i]) continue;
rep(k,i,N){
a[j][k]^=a[i][k];
}
}
}
for(int i=N-;i>=;i--){
if(!a[i][i]&&a[i][N]) return -;//无解
ans[i]=a[i][N]&a[i][i];
rep(j,,i-) a[j][N]^=(a[j][i]&ans[i]);
}
return <<res;
}
int s[],t[],res;
int main()
{
int T,N,u,v;
scanf("%d",&T);
while(T--){
memset(a,,sizeof(a));
scanf("%d",&N);
rep(i,,N-) scanf("%d",&s[i]);
rep(i,,N-) scanf("%d",&t[i]);
rep(i,,N-) a[i][N]=s[i]^t[i],a[i][i]=;
while(~scanf("%d%d",&u,&v)&&u+v!=){
a[v-][u-]=; //二者不要写反
}
int res=Guass(N);
if(res==-) puts("Oh,it's impossible~!!");
else printf("%d\n",res);
}
return ;
}

最新文章

  1. 用SignalR 2.0开发客服系统[系列2:实现聊天室]
  2. App内测神器之蒲公英
  3. gif图片加载问题
  4. Wojilu学习笔记 (01)
  5. sqlite API模型
  6. MySQL各版本的区别
  7. JSONP的小示例
  8. kubernetes centos 安装
  9. ORA-01031:insufficient privileges
  10. [改善Java代码]断言绝对不是鸡肋
  11. 【python】三个变量互换值
  12. Winpcap网络编程九之Winpcap实战,ARP协议获得MAC表及主机通信
  13. C#中Base64之编码,解码方法
  14. 四个漂亮CSS样式表
  15. nodeJS之事件events
  16. 学习springboot
  17. 在phpstorm中svn的使用
  18. java框架篇---hibernate之CRUD操作
  19. Android SO UPX壳问题小记
  20. Windows/Linux获取当前运行程序的绝对路径

热门文章

  1. .net core 2.0 webapi部署iis操作
  2. django数据库的表已迁移的不能重新迁移的解决办法
  3. 网络编程-day3
  4. 阿里巴巴开源项目汇总-(JAVA)
  5. 简易祖玛--canvas
  6. from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengwuyouItem
  7. C#保留小数点后几位
  8. unity解压缩zip发布后的一些问题
  9. 阶段01Java基础day25网络编程
  10. [linux-脚本]shebang(shabang #!)