题目链接

题意:

给出一个模3意义下的矩阵,每次选中一个元素就可以使得自身+2,上下左右元素+1。求所有元素变成0的一种解。

思路:

这个题目高斯消元复杂度明明是O(n^3)的啊,这个题O((n*m)^3)都不炸?

开关翻转的二进制高斯消元的变形,详细解释可以见:点击打开链接 此处不再过多解释了.

PS:

1. 还是强调一下,我们高斯消元构造的增广矩阵的最后一列对应的该位置操作次数,不是最后的状态!!!

这也就是为什么我的代码中(3-t)%3的原因.

2. 我们还是从末状态去找初始状态构造的增广矩阵,在把高斯消元的模板换成%3的即可.

构造矩阵的时候需要注意,因为现在动格子对自己影响为2,这里构造矩阵的时候,对应所在自己的方程里的一定不要写错

#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 905int a[maxn][maxn];//矩阵的系数
int mp[maxn][maxn];
int free_x[maxn*maxn]; //标记自由元
int x[maxn*maxn],free_num; //解集 自由元个数
int n, m;void debug () {cout << endl;for (int i = 0; i < n*m; i++) {for (int j = 0; j <= n*m; j++) {cout << a[i][j] << " ";} cout << endl;}cout << endl;
}int Gauss () {int max_r, col, k; //最大的数在的行 当前处理的列free_num = 0; //自由元个数for (k = 0, col = 0; k < n*m && col < n*m; k++, col++) {max_r = k;for (int i = k+1; i < n*m; i++) { //找到最大的数所在的行if (abs (a[i][col]) > abs (a[max_r][col]))max_r = i;}if (max_r != k) { //交换最大的数所在的行和当前行for (int i = 0; i <= n*m; i++)swap (a[k][i], a[max_r][i]);}if (a[k][col] == 0) { //判断自由元 处理当前行的下一列k--;free_x[free_num++] = col;continue;}for (int i = k+1; i < n*m; i++) {if (a[i][col]) {int lcm = a[i][col] / __gcd(a[i][col], a[k][col]) * a[k][col];int t1 = lcm / a[i][col];int t2 = lcm / a[k][col];for(int j = col; j <= n*m; j++) {if (k == 0 && i == 1) {}a[i][j] = ((a[i][j] * t1 - a[k][j] * t2) % 3 + 3) % 3;}}}}for (int i = k; i < n*n; i++) { //判断无解情况if (a[i][col])return -1;}for (int i = n*m-1; i >= 0; i--) { //回代x[i] = a[i][n*m];for (int j = i+1; j < n*m; j++)x[i] = ((x[i]-x[j]*a[i][j]) % 3 + 3) % 3;x[i] = x[i]*a[i][i] % 3;}return 0;
}void solve () {memset (x, 0, sizeof x);memset (free_x, 0, sizeof free_x);int tot = Gauss (); int ans = 0;for (int i = 0; i < n*m; i++)ans += x[i];printf ("%d\n", ans);for (int i = 0; i < n*m; i++) {for (int j = 0; j < x[i]; j++) {printf ("%d %d\n", i/m+1, i%m+1);}}return ;
}const int go[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool judge (int x, int y) {if (x < 0 || y < 0 || x >= n || y >= m)return 0;return 1;
}int main () {//freopen ("in", "r", stdin);int t;scanf ("%d", &t);while (t--) {scanf ("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf ("%d", &mp[i][j]);}}memset (a, 0, sizeof a);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i*m+j][i*m+j] = 2;//对应自己所在的方程对自己的影响为2. for (int k = 0; k < 4; k++) {int ii = i+go[k][0], jj = j+go[k][1];if (judge (ii, jj))a[i*m+j][ii*m+jj] = 1;}}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i*m+j][n*m] = (3-mp[i][j]) % 3;//矩阵保存的是操作的次数! }}//debug ();solve ();}return 0;
}

hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)相关推荐

  1. HDU 5755 Gambler Bo(高斯消元裸题)——2016 Multi-University Training Contest 3

    传送门 Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  2. [HDU 5755] Gambler Bo (高斯消元)

    HDU - 5755 给定一个 N×MN \times M的矩阵,每个格子都有一个数, 并且这些数都是 mod 3mod\ 3的 每次选一个格子操作,可以在这个格子加 2 mod 32\ mod\ 3 ...

  3. hdu 5755 Gambler Bo 高斯消元

    题目链接 给n*m的方格, 每个格子有值{0, 1, 2}. 然后可以对格子进行操作, 如果选择了一个格子, 那么这个格子的值+2, 这个格子上下左右的格子+1, 并且模3. 问你将所有格子变成0的操 ...

  4. HDU 5755 Gambler Bo(数论)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5755 题目大意: 给你一个矩阵,矩阵中是0,1,2三个数,你每次可以给其中一个数加2,但 ...

  5. hdu 5755 Gambler Bo【gauss】

    思路: n*m个数变化,设置n*m个变量,每个位置对应5个变量发生改变,连立n*m个方程,高斯消元求解,注意取模. // hdu 5755 #include <cstdio> #inclu ...

  6. HDU 5119 Happy Matt Friends(DP || 高斯消元)

    题目链接 题意 : 给你n个数,让你从中挑K个数(K<=n)使得这k个数异或的和小于m,问你有多少种异或方式满足这个条件. 思路 : 正解据说是高斯消元.这里用DP做的,类似于背包,枚举的是异或 ...

  7. hdu 5755 Gambler Bo 高斯消元

    Gambler Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5755 Description Gambler Bo is very profi ...

  8. hdu 5833 Zhu and 772002 (高斯消元)

    题目链接 //aaaaa自己的代码疯狂Wa,偷来卿学姐的代码 #include<bits/stdc++.h> using namespace std; const int maxn = 2 ...

  9. 【HDU 5755】Gambler Bo(高斯消元)

    [HDU 5755]Gambler Bo(高斯消元) Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072 ...

最新文章

  1. 数据结构与算法(6-4)线索二叉树
  2. 计算机二级各个科目的作用,计算机二级考试的各个科目的内容及区别.doc
  3. 关于SQL操作的一些经验
  4. Spring Boot 2.x整合Apollo代码示例
  5. 解析oracle的rownum
  6. Javascript跨域问题总结
  7. 1431.拥有最多糖果的孩z
  8. xb2xe2 是什么编码 php,python - 这是什么编码,如何解码
  9. 求向量的垂线_高考数学填空题如何快速求直线关于直线对称的直线方程
  10. 梯度下降-单变量线性回归-理论+代码+解释
  11. 2019-CS224n-Assignment2
  12. 2022-2028年中国纳米钛酸钡行业市场调查研究及投资策略研究报告
  13. 计算机代表学校拿什么奖,学校荣获第十届中国大学生计算机设计大赛优秀组织奖...
  14. 社会演化动力学:人类社会复杂性为何不断增加?
  15. 技嘉z68主板驱动下载地址
  16. 4.7 matlab交互式绘图工具(绘图工具栏)
  17. matlab调用zlg,stm32读取ZLG7290按键键值实验源码
  18. 谷歌浏览器自动填充功能怎么开启?自动填充功能开启方法
  19. 我把SpringBoot的banner换成了美女;老板:工作不饱和,建议加班
  20. RK3568平台开发系列讲解(环境篇)使用USB线缆升级固件

热门文章

  1. 一个基于高阶图匹配的多目标跟踪器:Online Multi-Target Tracking with Tensor-Based High-Order Graph Matching
  2. 使用接口实现打印机功能
  3. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  4. 苹果微信cookie传不到服务器,cookie解决微信不能存储localStorage的问题
  5. Lazada开店步骤Lazada开店需要条件
  6. rook 排错记录 + Orphaned pod found kube-controller-manager的日志输出
  7. 【TIC6657 DSP学习笔记】02 RTSC平台配置组件创建
  8. Mysql拼接查询结果
  9. 基于内容的图像检索引擎(以图搜图)
  10. Win32:三菱FX3U/FX5U读写软元件方法和注意事项