【poj1830-开关问题】高斯消元求解异或方程组
第一道高斯消元题目~
题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)0<=N<=29
我们用样例来模拟一下:

我的高斯消元求解异或方程组模版:
int gauss()
{
int i,j,k,l;
//j=当前要消第几个元
//i=当前消了几个元+1(n-i+1就是自由元个数),也就是当前j要处理的这个方程将要放在第i行,构成上三角矩阵。
//i、j不等是因为有些元是自由元,不需要消,这些方程放到最后面(维护上三角矩阵)。
for(i=,j=;i<=n && j<=n;j++)
{
for(k=j;k<=n;k++)
if(a[k][j]) break;//先找到一个这个元的系数不为0方程的换到第i行。
if(a[k][j])
{
for(l=;l<=n+;l++) swap(a[i][l],a[k][l]);
for(l=;l<=n;l++)//注意这里从1开始,因为把最后回代的过程合并了
{
if(l!=i && a[l][j])//如果系数不为0才异或消元
for(k=;k<=n+;k++)
a[l][k]^=a[i][k];
}
i++;
}
}
for(j=i;j<=n;j++)
if(a[j][n+]) return -;
return <<(n-i+);
}
说一下解的个数问题:
对增广矩阵[A b]做初等行变换,化成阶梯形(高斯消元法),如果存在[0,0,…,0,1]的行,就是无解;如果存在r行[0,0,…,0,0],就意味着有r个自由变量,因为这里的变量只取0/1,所以有2r个解;如果不存在[0,0,…,0,*],即把最后一行去掉后不存在全0行,则A为满秩矩阵,则方程组有唯一解。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
int n,bit[N],a[N][N]; void output()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n+;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
} int gauss()
{
int i,j,k,l;
//j=当前要消第几个元
//i=当前消了几个元+1(n-i+1就是自由元个数),也就是当前j要处理的这个方程将要放在第i行,构成上三角矩阵。
//i、j不等是因为有些元是自由元,不需要消,这些方程放到最后面(维护上三角矩阵)。
for(i=,j=;i<=n && j<=n;j++)
{
for(k=j;k<=n;k++)
if(a[k][j]) break;//先找到一个这个元的系数不为0方程的换到第i行。
if(a[k][j])
{
for(l=;l<=n+;l++) swap(a[i][l],a[k][l]);
for(l=;l<=n;l++)//注意这里从1开始,因为把最后回代的过程合并了
{
if(l!=i && a[l][j])//如果系数不为0才异或消元
for(k=;k<=n+;k++)
a[l][k]^=a[i][k];
}
i++;
}
}
for(j=i;j<=n;j++)
if(a[j][n+]) return -;
return <<(n-i+);
} int main()
{
int T,x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,,sizeof(a));
for(int i=;i<=n;i++) scanf("%d",&a[i][n+]);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
a[i][n+]^=x;
}
while()
{
scanf("%d%d",&x,&y);
if(!x && !y) break;
a[y][x]=;
}
for(int i=;i<=n;i++) a[i][i]=;
int ans=gauss();
if(ans==-) printf("Oh,it's impossible~!!\n");
else printf("%d\n",ans);
}
return ;
}
【poj1830-开关问题】高斯消元求解异或方程组的更多相关文章
- 【poj1222-又一道开关问题】高斯消元求解异或方程组
题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭.每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉. 题解: 这题和上一题几乎完全一样..就是要输出解 ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- [POJ1830]开关问题(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1830 题意:中文题面,求的是方案数. 首先可以知道, 如果方案数不止一个的话,说明矩阵行列式值为0,即存在自由变元,由于变量只有两种状 ...
- poj1830 开关问题[高斯消元]
其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了. 发现灯的操作情况顺序不影响结果,因为操作相当于 ...
- [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...
- [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)
题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...
- 【poj2947】高斯消元求解同模方程组【没有AC,存代码】
题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...
随机推荐
- WPF+数据库+三层
1.计算类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- Internet History
Alan Turing and Bletchley Park Top secret breaking effort(二战破译希特勒密码) 10,000 people at the peak(team ...
- ajax的一些实用技巧
1.尽量优先采用ajax获取html文件,然后再操作dom把数据填充到里面 在实际项目中,如果前端开发人员没有把页面给切分开,那么有如下两种办法可供选择:其一是,在各种点击事件中,用js去拼接并在拼接 ...
- Debian 7 amd64 + fbterm + ucimf
前段时间,显示器出了问题,导致Debian下只有终端显示正常,桌面显示效果很是摇晃模糊.遂起了念头,能不能在终端下就能完成日常的工作. google了很久,终于知道fbterm可以在终端下显示中文,加 ...
- Java-通过比较throw与throws来阐述抛出异常
转自:http://www.cnblogs.com/Miracle-Maker/p/6239346.html 浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区 ...
- 如何高效的使用Google
文章再转自知乎:http://www.zhihu.com/question/20161362
- 【bzoj4401】块的计数 结论题
题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...
- BZOJ4710 JSOI2011分特产(容斥原理+组合数学)
显然可以容斥去掉每人都不为空的限制.每种物品分配方式独立,各自算一个可重组合乘起来即可. #include<iostream> #include<cstdio> #includ ...
- CentOS 转义字符
常用转义字符 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串. 单引号(''):转义其中所有的变量为单纯的字符串. 双引号(""):保留其中的变量属性,不进行转义处理. 反引 ...
- [ZJOI2010]贪吃的老鼠 网络流
---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...