第一道高斯消元题目~

题目:有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-开关问题】高斯消元求解异或方程组的更多相关文章

  1. 【poj1222-又一道开关问题】高斯消元求解异或方程组

    题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭.每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉. 题解: 这题和上一题几乎完全一样..就是要输出解 ...

  2. 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组

    [题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...

  3. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  4. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10835   Accepted: 6 ...

  5. [POJ1830]开关问题(高斯消元,异或方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题面,求的是方案数. 首先可以知道, 如果方案数不止一个的话,说明矩阵行列式值为0,即存在自由变元,由于变量只有两种状 ...

  6. poj1830 开关问题[高斯消元]

    其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了. 发现灯的操作情况顺序不影响结果,因为操作相当于 ...

  7. [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)

    题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...

  8. [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)

    题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...

  9. 【poj2947】高斯消元求解同模方程组【没有AC,存代码】

    题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...

随机推荐

  1. Huffuman树

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  2. WinForm连续点击按钮只打开一次窗体

    许多朋友,学习C#时,制作WinForm小程序总会有一个问题,如果我们在父窗体设置的是点击一个按钮,打开一个子窗体,连续点击总会连续出现一样窗体,可是我们有时只想打开一次窗体,怎么办? 呵呵,我来方法 ...

  3. mac mysql连接报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    找了半天 又是kill进程,又是改设置文件,又是重启电脑,都不管用 翻到stackoverflow上的解决方案,实施成功: 原文链接:https://stackoverflow.com/questio ...

  4. linux svn apache

    借助apache运行的svn服务器 一:安装Apache HTTP Server 1.安装Apache HTTP Server yum install httpd httpd-devel -y 2.修 ...

  5. 浅析Nim游戏(洛谷P2197)

    首先我们看例题:P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔 ...

  6. 重拾C#教程:变量

    一个变量只不过是一个供程序操作的存储区的名字.在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局.范围内的值可以存储在内存中,可以对变量进行一系列操作. 我们已经讨论了各种数据类 ...

  7. 多线程中Local Store Slot(本地存储槽)[转]

    1. 使用ThreadStatic特性 ThreadStatic特性是最简单的TLS使用,且只支持静态字段,只需要在字段上标记这个特性就可以了: [ThreadStatic]   static str ...

  8. 51nod 1274 最长递增路径(DP)

    一开始自己想了一种跑的巨慢..写了题解的做法又跑的巨快..一脸懵逼 显然要求边权递增就不可能经过重复的边了,那么设f[i]为第i条边出发能走多远就好了,这是我一开始的写法,可能dfs冗余状态较多,跑的 ...

  9. Redis、Memcache

    ★ Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  10. 学习web安全之--初识安全

    随笔:随着互联网行业的飞速发展,互联网行业可谓日新月异,然而在繁华的背后,大多的互联网公司对于网络安全还是处于无重视,不作为的阶段,而作为一个程序员,如果也对信息安全视而不见的话,那将是这个公司的噩梦 ...