用高斯消元法解异或方程组
异或方程组就是形如这个样子的方程组:
M[0][0]x[0]^M[0][1]x[1]^…^M[0][N-1]x[N-1]=B[0]
M[1][0]x[0]^M[1][1]x[1]^…^M[1][N-1]x[N-1]=B[1]
…
M[N-1][0]x[0]^M[N-1][1]x[1]^…^M[N-1][N-1]x[N-1]=B[N-1]
其中“^”表示异或(XOR, exclusive or),M[i][j]表示第i个式子中x[j]的系数,是1或者0。B[i]是第i个方程右端的常数,是1或者0。
解这种方程可以套用高斯消元法,只须将原来的加减操作替换成异或操作就可以了,两个方程的左边异或之后,它们的公共项就没有了。
具体的操作方法是这样的:对于k=0..N-1,找到一个M[i][k]不为0的行i,把它与第k行交换,用第k行去异或下面所有M[i][j]不为0的行i,消去它们的第k个系数,这样就将原矩阵化成了上三角矩阵;最后一行只有一个未知数,这个未知数就已经求出来了,用它跟上面所有含有这个未知数的方程异或,就小觑了所有的着个未知数,此时倒数第二行也只有一个未知数,它就被求出来了,用这样的方法可以自下而上求出所有未知数。
有一个5*6的灯泡构成的矩阵,灯的开关规则是这样:当改变某盏灯的,状态时,这盏灯的上下左右相邻的灯的状态也随之改变。例如:
0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
当按下2行3列的开关时,状态变为:
0 1 0 0 1 0
1 1 1 0 1 1
0 0 0 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
游戏的目的是对于任意给定的亮灭初始态,通过一系列动作关闭所有的灯。
可以注意到的是:
1.矩阵的状态与按开关的顺序无关
2.如果某个开关按下了两次,那么就相当于取消了第一次的操作,也就是说没有开关需要按超过1次
现在问题是:对于给定的初始状态,求出需要按哪些开关来完成游戏
原题在这里
http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=1222
把上面的矩阵看成一个m*n的向量X=(x1,x2,...,x(m*n))
对于位置k上的开关,它将变化最多5个位置的开关,对应一个向量
C(k)=(0,0,...,1,0,....,1,...,0)
其中开关状态改变的位置为1,开关状态不改变的位置为0
对于初始向量X=(x1,x2,...,x(m*n)),使用了开关C(k)后,状态会变成
X+C(k) (mod 2)
所以对初始向量X,我们需要选择一系列的k1,k2,...,ks使得
X+C(k1)+C(k2)+....+C(ks) (mod 2)=O=(0,0,0,...,0)
我们可以同样构造一个0,1向量Y,使得,如果位置k出现在k1,k2,...ks中,那么Y
在位置k的值是1,不然是0,这样,我们就可以将上面公式写成矩阵形式
X+Y*C (mod 2)=O
其中C=(C(1)' C(2)' .... C(m*n)')'
也就是C是由这m*n个行向量构成的矩阵,第k行就是向量C(k)
最二阶域上,加和减是相同的,也就是上面的方程等价于
Y*C (mod 2)=X
其中C,X已知,求Y.
由于(mod 2)运算是一个域 (关于乘除加减封闭,加减是mod 2加减,还满足结合率,交换率)
所以我们可以直接在二阶域上用高斯消元法求解(注意加减是mod 2的,对应计算机上的异或运算)
其中,如果C可逆,解是唯一的,如果C不可逆,解可能不存在,也可能不唯一。
用高斯消元法解异或方程组相关推荐
- 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组
#include <stdio.h> int main() {puts("转载请注明出处");puts("地址:blog.csdn.net/vmurder/a ...
- 如何用matlab解异或方程,高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯...
高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk 539. 牛棚的灯 ★★☆ ...
- jzoj3823 遇见 [高斯消元解异或方程组]
Description Zyh独自一人在街上漫步.Zyh相信不久后应该就可以和她一起漫步,可是去哪里寻找那个她呢?Zyh相信每个人都有一个爱情的号码牌,这个号码牌是一个n*n的矩阵. 每个人都要在矩阵 ...
- [高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板
文章目录 理论 线性方程组整数类型解 线性方程组浮点类型解 模线性方程组 异或方程组 高斯约旦消元 约旦消元 无解 无穷解 唯一解 理论 高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解 ...
- POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)
POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...
- HDU5833 异或方程组的初步学习
题目 题目链接 题解 选出来的数相乘要能组成一个完全平方数,则这个完全平方数进行素数分解以后,相同的素因子的个数是偶数个. 基于这个结论,我们对与每一个候选数a[i]a[i]a[i]进行质因数分解(最 ...
- matlab用高斯消元法解线性方程组,用matlab利用高斯消元法求解线性方程组
用matlab利用高斯消元法求解线性方程组Tag内容描述: 1.用C语言编写软件完成以下任务:请用高斯列主元消元法解下列线性方程组:方法说明(以4阶为例):第1步消元在增广矩阵(A,b)第一列中找到绝 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南):签到题A Matrix Equation(高斯消元求线性异或方程组自由元个数)
problem 给出两个n*n的01矩阵,A和B 定义两种运算,Z(i,j)=Xi行*Yj列相加%2,D(i,j)=X(i,j)*Y(i,j) 求最多有多少个可能的矩阵C,满足A运算1C==B运算2C ...
- 高斯消元法解线性方程组(C++实现)
高斯消元法解线性方程组(C++实现) #include<cstdio> #include<iostream> using namespace std; void gaosi(d ...
最新文章
- MATLAB【九】————ICP算法实现
- [转贴]电阻电容的封装形式如何选择
- bzoj29894170数列——二进制分组+主席树
- redis的持久化方式有哪些?
- 自己实现strstr函数与strchr函数
- java语言_JAVA语言
- 华为发布基于自进化AI的HiSec Insight安全态势感知系统
- STM8学习笔记---NTC热敏电阻的使用
- cesium cesium is not defined
- PNAS:杏仁核个体特异性功能连接:精准精神病学基础
- 网络地址转换—NAT——总结
- Maximum Likelihood 最大似然估计
- 科海故事博览杂志科海故事博览杂志社科海故事博览编辑部2022年第15期目录
- 前端知识:使用layui模板搭建页面,简单快捷
- 光电探测器的噪声等效功率,NEP
- Apollo微服务配置中心详解
- 新三板挂牌和上市的区别在哪
- 常用JS图片滚动代码大全
- 加入收藏夹,设为首页代码,强制设为主页代码
- 电脑右键刷新有用吗?真的能给电脑提速吗?
热门文章
- DY-SV17F语音播放模块应用篇二 【UART 串口模式】
- html获取孩子节点,JS实现JQuery children()方法,获取某个元素下所有子元素节点或者某个元素下指定标签元素 – Fakin's Blog...
- 复制一个Word文档的部分或全部内容到另一个Word文档
- PHP验证统一信用代码
- 为什么我发布的文章都是乱码呢?
- 关于JDBC连接MySQL的时候出现警告:Establishing SSL connection without server‘s identity verification is not recom
- 免费的歌曲伴奏网站—5sing
- 一个完整的c语言程序结构图,用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码.docx...
- uniapp中在线预览(打开)文件
- ASP.NET 电影票信息的增删查改