hihoCoder#1196 : 高斯消元·二(开关灯问题)
传送门
高斯消元解异或方程组
小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 : 高斯消元·二(开关灯问题)相关推荐
- hihoCoder #1195 : 高斯消元·一
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走,赶紧去看 ...
- POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)
POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...
- 高斯消元(二)——竞赛题目中异或和的高斯消元
然而算法竞赛并不会考到简单的加减消元,它回很隐晦的让你明白,高斯消元还有另外一种用途,那就是解异或方程组. 异或,C++中符号为'^'或关键字"xor",它的逆运算为它本身,可以看 ...
- hihocoder图像算子(高斯消元)
描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图为H × W的矩阵A,算子矩阵为D × D的矩阵Op,则处理后的矩阵B大小为(H-D+1) × ...
- hihoCoder 1166 交换代数 (高斯消元,概率)
题意: 给出区间[1,n]的状态,有0.1.现在每次可以选择任意区间取翻转,问全部翻转成0的次数期望.总共有n(n+1)/2个区间. 题解: 这个CLJ链接将的很清楚了. 那么根据高斯消元列方程求解, ...
- Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter
文章目录 前言 XOR-filter 实现原理 xor filter 的构造原理 xor filter 构造总结 XOR-filter 和 ADD-filter对比 XOR-filter 在计算上的优 ...
- BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 以前尝试了非常久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 如 ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- [SDOI2010]外星千足虫 题解 高斯消元+bitset简介
高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一 ...
最新文章
- python能实现excel什么功能_Python pandas对excel的操作实现示例
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
- VC开发多语言界面支持的简单方法
- WebRTC的现状和未来:专访W3C WebRTC Chair Bernard Aboba(下)
- JavaScript权威指南--多媒体和图形编程
- centos安装kvm
- JAVA中的反射机制和模块化
- Failed to start The nginx HTTP and reverse proxy server
- 推荐一款很好用的图床工具picgo
- 在做产品经理的实习收获(第二篇)
- 成都拉升12名,长沙提升3位,最新全球城市排名出炉
- TextView自动调节字体大小
- matlab中函数参数和变量作用域
- linux 底下traceroute报错(下载安装流程教学)
- Android TextView 文字两端对齐
- NGINX免费配置二级域名及同时开启HTTPS(HTTP强制转HTTPS)nodejs的express后端项目,前端next.js的SSR项目
- 力软新版APP:聊一聊Uni-App框架,跨平台多端解决方案
- Swagger2 3.0的使用
- 「短视频+社交电商」营销模式爆发式发展,带来的好处有什么?
- 数据压缩作业二——分析tga文件
热门文章
- python绘图实例-Python——matplotlib基础绘图函数示例
- python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片
- python自学什么书比较好-19年学习Python有什么好的书籍推荐吗?
- 如何使用python画折线图-python使用matplotlib绘制折线图教程
- python语言翻译-教你用Python抓取百度翻译
- python中文版怎么安装-怎么安装python解释器
- python编程爱心-如何用python画爱心
- 用python画皮卡丘画法-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘
- python基础30个常用代码大全-Python3列表内置方法大全及示例代码小结
- 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?