传送门

高斯消元解异或方程组

小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi。

小Ho:小Hi,这次又该怎么办呢?

小Hi:让我们来分析一下吧。

首先对于每一个格子的状态,可能会对它造成影响的是其自身和周围4个格子,这五个格子被按下的总次数也就等于该格子所改变的总次数。

对于任意一个格子,如果这个格子改变了偶数次状态,则等价于没有发生改变。

我们可以将1看作格子亮着,0看作格子暗着,每改变1次就加1,最后格子的状态等于其总数值 MOD 2。

则其运算结果刚好满足异或运算,即每改变一次等于状态值 xor 1。

同样的对于一个格子和它周围的4个格子来说,若格子被按下偶数次,它自身和周围4个格子的状态也等于没有发生改变。所以我们可以知道:任意一个格子至多被按下一次。

假设有数组x[1..30],分别表示这30个格子是否按下1次,若按下则x[i]=1,否则x[i]=0。

则对于1个格子,他最后的状态为:

当前状态 = 初始状态 xor (a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30])

其中a[i]表示格子i是否会对当前格子产生影响,若能够则a[i] = 1,否则a[i] = 0

对方程进行变换有:

(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = 当前状态 xor 初始状态

因为我们的目标是要让所有等格子都为亮的状态,故我们需要让 当前状态 = 1,则:

(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = 1 xor 初始状态

不妨设y = 1 xor 初始状态:

(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = y

对于所有的格子,我们可以连立出方程组:

(a[ 1][1] * x[1]) xor (a[ 1][2] * x[2]) xor ... xor (a[ 1][30] * x[30]) = y[ 1]
(a[ 2][1] * x[1]) xor (a[ 2][2] * x[2]) xor ... xor (a[ 2][30] * x[30]) = y[ 2]...
(a[30][1] * x[1]) xor (a[30][2] * x[2]) xor ... xor (a[30][30] * x[30]) = y[30]

到此,我们的目标就是求出一个x[1..30],使得上面的方程组成立。

小Ho:这个看上去和高斯消元很像啊。

小Hi:没错,这个方程组叫异或方程组,它可以用和高斯消元同样的方法来解决。

其解答过程几乎和高斯消元无异,判定无解和多解的方式也相同。唯一需要注意的是消元过程不再是高斯消元的加减,而是通过xor运算来进行消元。比如消除第j行第i列的1:

a[j][k] = a[j][k] xor a[i][k], y[j] = y[j] xor y[i]

其原理是:

    (a[j][1] * x[1]) xor (a[j][2] * x[2]) xor ... xor (a[j][30] * x[30]) xor (a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[ i][30] * x[30]) = y[j] xor y[i]
<=> ((a[j][1] * x[1]) xor (a[i][1] * x[1])) xor (((a[j][2] * x[2]) xor (a[i][2] * x[2]))) xor ... xor ((a[j][30] * x[30]) xor (a[i][30] * x[30])) = y[j] xor y[i]<=> ((a[j][1] xor a[i][1]) * x[1]) xor ((a[j][2] xor a[i][2]) * x[2]) xor ... ((a[j][30] xor a[i][30]) * x[30]) = y[j] xor y[i]

而且由于给定游戏板是固定的,我们可以知道a[i][j]矩阵一定是固定的,而且通过计算可以知道我们消元得到的上三角矩阵也是固定的,并且在这一次的问题中该上三角矩阵是满秩的,所以其一定存在唯一解。

所以我们一定有办法完成这个游戏。

小Ho:我明白了,我这就去写程序,这奖品我拿定了!

#include <cmath>
#include <cstdio>
#include <iostream>
#define N 35
#define D(x, y) (((x) - 1) * 6 + (y))using namespace std;int ans;
int a[N][N];
char s[N][N];inline void Guass()
{int i, j, k, t;for(j = 1; j <= 30; j++){t = j;for(i = j; i <= 30; i++)if(a[i][j] > a[t][j])t = i;if(t != j) swap(a[t], a[j]);for(i = j + 1; i <= 30; i++)if(a[i][j])for(k = j; k <= 31; k++)a[i][k] ^= a[j][k];}for(i = 30; i >= 1; i--){for(j = i + 1; j <= 30; j++)a[i][31] ^= (a[i][j] * a[j][31]);if(a[i][31]) ans++;}
}int main()
{int i, j;for(i = 1; i <= 5; i++){scanf("%s", s[i] + 1);for(j = 1; j <= 6; j++){a[D(i, j)][D(i, j)] = 1;a[D(i, j)][31] = 1 ^ (s[i][j] - '0');if(1 < i && i <= 5) a[D(i - 1, j)][D(i, j)] = a[D(i, j)][D(i - 1, j)] = 1;if(1 <= i && i < 5) a[D(i + 1, j)][D(i, j)] = a[D(i, j)][D(i + 1, j)] = 1;if(1 < j && j <= 6) a[D(i, j - 1)][D(i, j)] = a[D(i, j)][D(i, j - 1)] = 1;if(1 <= j && j < 6) a[D(i, j + 1)][D(i, j)] = a[D(i, j)][D(i, j + 1)] = 1;}}Guass();printf("%d\n", ans);for(i = 1; i <= 5; i++)for(j = 1; j <= 6; j++)if(a[D(i, j)][31])printf("%d %d\n", i, j);return 0;
}

  

转载于:https://www.cnblogs.com/zhenghaotian/p/7494942.html

hihoCoder#1196 : 高斯消元·二(开关灯问题)相关推荐

  1. hihoCoder #1195 : 高斯消元·一

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走,赶紧去看 ...

  2. POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)

    POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...

  3. 高斯消元(二)——竞赛题目中异或和的高斯消元

    然而算法竞赛并不会考到简单的加减消元,它回很隐晦的让你明白,高斯消元还有另外一种用途,那就是解异或方程组. 异或,C++中符号为'^'或关键字"xor",它的逆运算为它本身,可以看 ...

  4. hihocoder图像算子(高斯消元)

    描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图为H × W的矩阵A,算子矩阵为D × D的矩阵Op,则处理后的矩阵B大小为(H-D+1) × ...

  5. hihoCoder 1166 交换代数 (高斯消元,概率)

    题意: 给出区间[1,n]的状态,有0.1.现在每次可以选择任意区间取翻转,问全部翻转成0的次数期望.总共有n(n+1)/2个区间. 题解: 这个CLJ链接将的很清楚了. 那么根据高斯消元列方程求解, ...

  6. Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter

    文章目录 前言 XOR-filter 实现原理 xor filter 的构造原理 xor filter 构造总结 XOR-filter 和 ADD-filter对比 XOR-filter 在计算上的优 ...

  7. BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元

    题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 以前尝试了非常久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 如 ...

  8. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  9. [SDOI2010]外星千足虫 题解 高斯消元+bitset简介

    高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一 ...

最新文章

  1. python能实现excel什么功能_Python pandas对excel的操作实现示例
  2. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
  3. VC开发多语言界面支持的简单方法
  4. WebRTC的现状和未来:专访W3C WebRTC Chair Bernard Aboba(下)
  5. JavaScript权威指南--多媒体和图形编程
  6. centos安装kvm
  7. JAVA中的反射机制和模块化
  8. Failed to start The nginx HTTP and reverse proxy server
  9. 推荐一款很好用的图床工具picgo
  10. 在做产品经理的实习收获(第二篇)
  11. 成都拉升12名,长沙提升3位,最新全球城市排名出炉
  12. TextView自动调节字体大小
  13. matlab中函数参数和变量作用域
  14. linux 底下traceroute报错(下载安装流程教学)
  15. Android TextView 文字两端对齐
  16. NGINX免费配置二级域名及同时开启HTTPS(HTTP强制转HTTPS)nodejs的express后端项目,前端next.js的SSR项目
  17. 力软新版APP:聊一聊Uni-App框架,跨平台多端解决方案
  18. Swagger2 3.0的使用
  19. 「短视频+社交电商」营销模式爆发式发展,带来的好处有什么?
  20. 数据压缩作业二——分析tga文件

热门文章

  1. python绘图实例-Python——matplotlib基础绘图函数示例
  2. python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片
  3. python自学什么书比较好-19年学习Python有什么好的书籍推荐吗?
  4. 如何使用python画折线图-python使用matplotlib绘制折线图教程
  5. python语言翻译-教你用Python抓取百度翻译
  6. python中文版怎么安装-怎么安装python解释器
  7. python编程爱心-如何用python画爱心
  8. 用python画皮卡丘画法-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘
  9. python基础30个常用代码大全-Python3列表内置方法大全及示例代码小结
  10. 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?