【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5755

【题目大意】

  一个n*m由0,1,2组成的矩阵,每次操作可以选取一个方格,使得它加上2之后对3取模,周围的四个方格加上1后对3取模,请你在n*m操作次数内让整个矩阵变成0。输出一种方案。

【题解】

  枚举第一行的方式显然是不行的,因为3的30次方显然不是可以承受的范围,考虑如果存在第0行元素,那么这一行的最终状态就是第一行的操作次数,因为每个格子很明显只会由第一行对应的正下方的格子影响,我们在第n行操作次数已知的情况下,可以推得第n+1行的操作次数的情况,因此,我们假设第0行的元素为x1,x2……xm,逐行进行线性方程的变换,最后由于最后一行操作结束后必须使得该行全为0,那么我们可以得到m个线性方程,高斯消元可以解出第一行的操作次数。

  注意到3是一个神奇的数字,所以在消元的过程中可以直接让确定行和预消除行的首元素相乘获得倍数关系。此外,系数在模情况下的变换和其在其余符号下的运算也是一样的。因为根据同余模定理,(3-t*x1)%3=(3*x1-t*x1)%3=(3-t)%3,所以系数可以和原数进行一样模运算。

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. #define rep(i,n) for(int i=1;i<=n;i++)
  6. const int N=35;
  7. int ans,n,m,T,a[N][N],p[N][N],f[N][N][N];
  8. int DP(int i,int j,int k){
  9. int t=(f[i][j-1][k]+2*f[i][j][k]+f[i][j+1][k]+f[i-1][j][k])%3;
  10. return ((3-t)%3+3)%3;
  11. }
  12. int GetAns(int i,int j){
  13. int t=(p[i][j-1]+2*p[i][j]+p[i][j+1]+p[i-1][j]+a[i][j])%3;
  14. return ((3-t)%3+3)%3;
  15. }
  16. void Gauss(int n,int m) {
  17. int d,i,j,k,h,w=0;
  18. for(i=1,j=1;j<m;j++,w=0){
  19. for(k=i;k<=n;k++)if(p[k][j])w=k;
  20. if(w){
  21. for(k=j;k<=m;k++)swap(p[i][k],p[w][k]);
  22. for(k=i+1;k<=n;k++)
  23. if(p[k][j]){
  24. d=p[k][j]*p[i][j]%3;
  25. for(h=j;h<=m;h++)p[k][h]=(p[k][h]-d*p[i][h]+6)%3;
  26. }i++;
  27. }if(i>n)break;
  28. }for(j=1;j<=m;j++)f[1][j][j]=0;
  29. for(j=i-1;j;j--){
  30. for(k=1;k<m;k++)if(p[j][k])break;
  31. for (d=0,h=k+1;h<m;h++)if(f[1][h][h]&&p[j][h])d=(d+f[1][h][h]*p[j][h])%3;
  32. f[1][k][k]=p[j][k]*(3-d+p[j][m])%3;
  33. }memset(p,0,sizeof(p));
  34. for(j=1;j<=m;j++)p[1][j]=(f[1][j][j]+3)%3;
  35. }
  36. int main(){
  37. scanf("%d",&T);
  38. while(T--){
  39. scanf("%d%d",&n,&m);
  40. rep(i,n)rep(j,m)scanf("%d",&a[i][j]);
  41. memset(f,0,sizeof(f));
  42. rep(i,m)f[1][i][i]=1;
  43. rep(i,n)rep(j,m){
  44. f[i+1][j][m+1]=(3-a[i][j]+DP(i,j,m+1))%3;
  45. rep(k,m)f[i+1][j][k]=DP(i,j,k);
  46. }memset(p,0,sizeof(p));
  47. rep(i,m){
  48. p[i][m+1]=((3-f[n+1][i][m+1])%3+3)%3;
  49. rep(j,m)p[i][j]=f[n+1][i][j];
  50. }Gauss(m,m+1);ans=0;
  51. rep(i,m)ans+=p[1][i];
  52. for(int i=2;i<=n;i++)rep(j,m)p[i][j]=GetAns(i-1,j),ans+=p[i][j];
  53. printf("%d\n",ans);
  54. rep(i,n)rep(j,m)rep(k,p[i][j])printf("%d %d\n",i,j);
  55. }return 0;
  56. }

  

HDU 5755 Gambler Bo(高斯消元)的更多相关文章

  1. hdu 5755 Gambler Bo 高斯消元

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

  2. hdu 5755 2016 Multi-University Training Contest 3 Gambler Bo 高斯消元模3同余方程

    http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意:一个N*M的矩阵,改变一个格子,本身+2,四周+1.同时mod 3;问操作多少次,矩阵变为全0.输出 ...

  3. Gambler Bo (高斯消元求特解)

    对于图中的每一个点假设点击Xi * m + j 然后每个点都有那么对于每一个点可以列举出一个方程式,n*m个点解n*m个未知数.利用高斯消元就可以解决. 问题就在这个题目可能不止有一个特,所以我们需要 ...

  4. HDU 4870 Rating(高斯消元 )

    HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...

  5. HDU 3949 XOR(高斯消元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意:给出一个长度为n的数列A.选出A的所有子集(除空集外)进行抑或得到2^n-1个数字,去重排 ...

  6. [hdu 3949]线性基+高斯消元

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了. 之所以可以这样做,证明如下. 首 ...

  7. HDU 3949 XOR(高斯消元搞基)

    HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...

  8. HDU 3364 Lanterns (高斯消元)

    题意:有n个灯和m个开关,每个开关控制数个灯的状态改变,给出k条询问,问使灯的状态变为询问中的状态有多少种发法. 析:同余高斯消元法,模板题,将每个开关控制每个灯列成行列式,最终状态是结果列,同余高斯 ...

  9. [ACM] hdu 4418 Time travel (高斯消元求期望)

    Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...

随机推荐

  1. Java学习之网络编程实例

    转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...

  2. HTTP填坑

    HTTP知识填坑 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",& ...

  3. 深入理解this对象

    最近一直在看js关于面向对象编程方面的东西,那么this肯定是需要一个被吃透 理解 同时灵活运用的对象 现在总结一下自己的学习成果: 我们可以用一句很形象的话来理解什么是this关键字? " ...

  4. Mac Please try running this command again as root/Administrator.

    mac 终端安装程序,需要权限,出现以下提示语句: Please try running this command again as root/Administrator. 需要执行以下命令即可: s ...

  5. Python核心编程笔记----注释

    python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "re ...

  6. Xamarin生成的APK大小分析

    原文:Xamarin生成的APK大小分析 刚接触Xamarin都会被Xamarin的售价吓一跳,另外就是它生成的APK大小,官方也有相关的说明,这里加上自己的理解同意讲解下: 以下是针对Android ...

  7. 紫薇~还记得大明湖畔的HTML5智力拼图吗?

    曲线谜团是非常有趣的HTML5智力游戏,据说超过多少分会有惊喜,游戏简单易操作,偶尔抛弃那种杀死脑细胞的大型游戏,玩玩这种简单经典的益智小游戏,放松放松,也是不错的选择嘛-将游戏 通过 统一开发环境( ...

  8. 显示标题栏中标题左侧的小图icon

    如何显示网站logo,定义网站收藏夹图标 代码与解释 <link rel="shortcut icon" href="/path/favicon.ico" ...

  9. ASP.NET MVC开发必看系列

    一.关于HTTP协议的那些事 这可以说我们开发WEB程序的空气,推荐不断温故知新! HTTP协议 (一) HTTP协议详解 HTTP协议 (二) 基本认证 HTTP协议 (三) 压缩 HTTP协议 ( ...

  10. 浅谈Spring(二)

    一.AOP编程(面向切面编程) AOP的本质是代理. 1.静态代理设计模式 概念:通过代理类为原始类增加额外功能. 代理类 = 原始类 + 额外功能 +实现原始类的相同接口. 优点:避免原始类因为额外 ...