POJ - 1830:开关问题 (开关问题-高斯消元-自由元)
2024-08-24 04:16:48
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 ;
}
最新文章
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
- App内测神器之蒲公英
- gif图片加载问题
- Wojilu学习笔记 (01)
- sqlite API模型
- MySQL各版本的区别
- JSONP的小示例
- kubernetes centos 安装
- ORA-01031:insufficient privileges
- [改善Java代码]断言绝对不是鸡肋
- 【python】三个变量互换值
- Winpcap网络编程九之Winpcap实战,ARP协议获得MAC表及主机通信
- C#中Base64之编码,解码方法
- 四个漂亮CSS样式表
- nodeJS之事件events
- 学习springboot
- 在phpstorm中svn的使用
- java框架篇---hibernate之CRUD操作
- Android SO UPX壳问题小记
- Windows/Linux获取当前运行程序的绝对路径
热门文章
- .net core 2.0 webapi部署iis操作
- django数据库的表已迁移的不能重新迁移的解决办法
- 网络编程-day3
- 阿里巴巴开源项目汇总-(JAVA)
- 简易祖玛--canvas
- from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengwuyouItem
- C#保留小数点后几位
- unity解压缩zip发布后的一些问题
- 阶段01Java基础day25网络编程
- [linux-脚本]shebang(shabang #!)