POJ 1830 开关问题 异或高斯消元
题目链接
将题目转化为矩乘问题
构建一个 \(n \times n\) 的开关信息矩阵,其中第 \(i\) 列第 \(j\) 行的元素为 \(0 / 1\) 代表在改变开关 \(i\) 的情况下开关 \(j\) 是否会改变
将该开关信息矩阵乘上一个 \(n\times 1\) 的答案矩阵,其中第 \(i\) 行的元素为 \(0/1\) 代表是否拉第 \(i\) 个开关
得到的是一个 \(n\times 1\) 的矩阵,将其与开关的初始状态矩阵 逐位相异或(注意,不是矩乘) 若得到开关的结果状态矩阵,则答案加一
利用异或的性质 a^b=b^a ,将结果矩阵逐位异或上初始矩阵,我们就得到了矩乘的标准形式 \(Ax=b\)
最后的答案即为 \(x\) 的 \(2\) 的自由元个数次方 (因为每个自由元只可取 \(0/1\)),也即 \(2\) 的 \(n-rank(A)\) 次方
下面是代码:
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_N = 50;
int mat[MAX_N][MAX_N];
int Gauss(int n) {
int rank = 0;
for (int col = 0; col < n; ++col) { // 逐列找 pivot
int pivotRow = -1;
for (int row = rank; row < n; ++row) {
if (mat[row][col]) { // 找到了,记录 pivot 所在行的位置
pivotRow = row;
break;
}
}
if (pivotRow == -1) continue; // 没找到,自由元++
for (int i = 0; i <= n; ++i)
swap(mat[pivotRow][i], mat[rank][i]); // 将 pivot 所在行的位置交换到第 rank 行(行数从 0 开始) 以形成下三角矩阵
for (int i = rank + 1; i < n; ++i) {
if (mat[i][col]) {
for (int j = col; j <= n; ++j) mat[i][j] ^= mat[rank][j]; // 异或消元
}
}
++rank; // 矩阵的阶++
}
for (int row = rank; row < n; ++row)
if (mat[row][n]) return -1; // 高消后此时 rank+1 ~ n 行左边全为 0,若最右元素仍不为 0 则出现了 0=n,方程无解
return rank; // 返回矩阵 A 的阶
}
int main() {
int k;
cin >> k;
while (k--) {
int n;
cin >> n;
for (int i = 0; i < n; ++i)
mat[i][i] = 1;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
mat[i][n] ^= x;
}
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
mat[i][n] ^= x; // 构建 b 结果状态矩阵(向量)
}
int x, y;
while (cin >> x >> y) {
if (!x && !y) break;
mat[y - 1][x - 1] = 1; // 构建 A 矩阵
}
int ans = Gauss(n);
if (~ans) {
cout << (1 << (n - ans)) << endl; // n-rank(A) 即自由元个数,每个自由元都有 0/1 两种可能取值
} else {
cout << "Oh,it's impossible~!!" << endl;
}
memset(mat, 0, sizeof(mat));
}
return 0;
}
POJ 1830 开关问题 异或高斯消元的更多相关文章
- poj1830开关问题——异或高斯消元
题目:http://poj.org/problem?id=1830 根据题意,构造出n元方程组: a(1,1)x1 ^ a(1,2)x2 ^ a(1,3)x3 ... a(1,n)xn = st1 ^ ...
- POJ 1222【异或高斯消元|二进制状态枚举】
题目链接:[http://poj.org/problem?id=1222] 题意:Light Out,给出一个5 * 6的0,1矩阵,0表示灯熄灭,反之为灯亮.输出一种方案,使得所有的等都被熄灭. 题 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)
http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
[题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...
- POJ 3185 The Water Bowls(高斯消元-枚举变元个数)
题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...
- SGU 260.Puzzle (异或高斯消元)
题意: 有n(<200)个格子,只有黑白两种颜色.可以通过操作一个格子改变它和其它一些格子的颜色.给出改变的关系和n个格子的初始颜色,输出一种操作方案使所有格子的颜色相同. Solution: ...
- Luogu3164 CQOI2014 和谐矩阵 异或高斯消元
传送门 题意:给出$N,M$,试构造一个$N \times M$的非全$0$矩阵,其中所有格子都满足:它和它上下左右四个格子的权值之和为偶数.$N , M \leq 40$ 可以依据题目中的条件列出有 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解
题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
随机推荐
- kafka集群under replicated分析
近期随着业务消息量增大,现网几套kafka集群频繁收到under repliacted告警,集合近期定位分析过程,主要有以下几个方面:1. 查看是否有主机挂掉,或近期是否有主机重启,通过kafdrop ...
- Hadoop环境的搭建
Hadoop HDFS.Yarn.MapReduce Hadoop集群环境搭建 完全分布式环境,伪分布式将其中的多台服务器改为一台,并将配置文件中的相关内容更改即可 1.安装Linux系统模型机 关闭 ...
- kali修改root用户和密码,以及更新源,超详细教学。
大家好! 又是你们那个傻傻的河东, 今天来讲修改root用户和更新源. 打开上期的kali虚拟机 开启虚拟机 使出吃奶的劲按"e"键:) 进入下面的界面 然后往下找到 Linux ...
- JS中立即执行函数和闭包的区别
函数声明规则:必须指定一个函数名字 foo(); function foo() { console.log("函数声明") } 由于函数声明会被提升,所以调用函数可以在之前或之后调 ...
- rxswift自定义扩展UI组件
扩展UI组件时常用到的一些发布者与订阅者如下: 发布者: ControlEvent(专门用于描述 UI 控件所产生的事件) 订阅者(观察者): Binder(专门用于绑定UI状态的,如:当某个状态改变 ...
- Day24:结论的撰写&&openid再次尝试
今日完成的任务: 1.完成部分总报告结论的撰写. 2.再次尝试获取openid 根据官方文档,wx.login()的回调函数中,需要我们传递生成的用户登录凭证到code2accessToken的接口中 ...
- linux 安装简洁的 zsh
为什么要安装简洁的 zsh zsh 是 shell 中的佼佼者,但是网上配置 zsh的方案,千篇一律的都是配置的 oh-my-zsh,个人感觉非常臃肿,配置低的话,用起来还会非常卡. 安装 zsh 本 ...
- openssl常用操作
参考:https://www.golinuxcloud.com/openssl-view-certificate/ 查看证书信息 openssl x509 -in server.crt -text - ...
- 微信小程序云开发使用Typescript
1.首先参考陈希章@中国在微信小程序开发中使用Typescript中的内容了解相关的内容 2.按以下步聚进行设置 1)确认本机环境已安装npm.通过在安装目录下输入 npm --v 如返回具体的版本, ...
- postman脚本语法大全,不包括插件语法
官方语法例子:https://learning.postman.com/docs/writing-scripts/script-references/test-examples/ 官方语法库:http ...