为什么可以跑n立方,我也不知道,反正就是可以。

模2意义的,据说每一行可以存一个bitset,会比用bool更快(快32倍?)。

本题告诉我们一个道理:

高斯消元之后,每个变量的含义不变(虽然交换了两行,但是实际上那个位置的向量还是表示那个单元),不需要复原。

每个变量要前往的目标状态不一样。注意非自由变量要用新的右边来确定值。

并不是所有的自由变量都在右下角,有可能有完全空的列。

也可以在给每行赋值秩的同时指定该列是秩为第几的列,0表示空列。

可以在消元的同时对自由变量进行赋值,非自由变量立刻由他决定。但是感觉很扯。

#include<bits/stdc++.h>
#define ll long long
using namespace std; int n,m,r; inline int antii(int id) {
int res=((id+m-1)/m);
return res;
} inline int antij(int id) {
int res=id%m;
if(res==0)
res=m;
return res;
} inline int id(int,int); bool tx[1800]= {};
bool allzero[1800]= {};
bool outtm[50][50]= {}; bool out() {
int have1=0;
for(int id=1; id<=n*m; id++) {
outtm[antii(id)][antij(id)]=tx[id];
} for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(outtm[i][j]^outtm[i-1][j]^outtm[i+1][j]^outtm[i][j-1]^outtm[i][j+1]) {
return false;
}
if(outtm[i][j])
have1=1;
}
} if(!have1)
return false; for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++)
printf("%d%c",(int)outtm[i][j]," \n"[j==m]);
} return true; //高斯消元后,每个变量的目标已经改变了,不需要复原!!!
} namespace Gauss_Jordan_Elimination {
const int MAXN=1800;
const int MAXM=1800;
bool a[MAXN][MAXM+1];
bool ans[MAXN]; //返回增广矩阵的秩,-1表示无解
int gauss_jordan(int n,int m) { int r=0;
for(int i=1; i<=m; i++) {
//当前是第i列
int mx=-1;
//从当前秩的下一行开始往下数
for(int j=r+1; j<=n; j++)
if(a[j][i]) {
mx=j;
break;
}
if(mx==-1) {
//该列全0,被跳过
continue;
}
r++;
//增加一个线性基,当前秩增加
if(mx!=r) {
//需要交换
for(int j=1; j<=m+1; j++)
//m+1表示增广矩阵
swap(a[r][j],a[mx][j]);
//交换行
} for(int j=1; j<=n; j++) {
//枚举每一行
if(j!=r&&a[j][i]) {
//消去除了r以外的其他行
//该行系数是当前列的tmp倍
for(int k=i; k<=m+1; k++) {
//把当前列对应行位置扩大tmp倍,然后用每个元素减去,由高斯约当的过程,左边的绝对是0
a[j][k]^=a[r][k];
}
}
}
} return r;
}
} using namespace Gauss_Jordan_Elimination; inline int id(int i,int j) {
if(i>=1&&i<=n&&j>=1&&j<=m)
return (i-1)*m+j;
else
return 0;
} int dx[4]= {-1,1,0,0};
int dy[4]= {0,0,-1,1}; void dfs(int x,bool have1) {
if(x==0) {
if(have1) {
if(out()) {
exit(0);
}
}
return;
}
if(allzero[x]) {
tx[x]=1;
dfs(x-1,1);
tx[x]=0;
dfs(x-1,have1);
} else {
bool v=a[x][n*m+1];
for(int i=x+1; i<=n*m; i++) {
v^=a[x][i]&tx[i];
}
tx[x]=v;
dfs(x-1,have1|v);
}
} int main() {
scanf("%d%d",&n,&m); {
{
memset(a,0,sizeof(a));
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
int tid=id(i,j);
a[tid][tid]=1;
for(int k=0; k<4; k++) {
int ttid=id(i+dx[k],j+dy[k]);
if(ttid) {
a[tid][ttid]=1;
}
}
}
} r=gauss_jordan(n*m,n*m); for(int i=1; i<=n*m; i++) {
allzero[i]=1;
for(int j=1; j<=n*m; j++) {
if(a[i][j]) {
allzero[i]=0;
break;
}
}
} dfs(n*m,0);
}
} }

洛谷 - P3164 - 和谐矩阵 - 高斯约旦消元法的更多相关文章

  1. BZOJ 3503: [Cqoi2014]和谐矩阵( 高斯消元 )

    偶数个相邻, 以n*m个点为变量, 建立异或方程组然后高斯消元... O((n*m)^3)复杂度看起来好像有点大...但是压一下位的话就是O((n*m)^3 / 64), 常数小, 实际也跑得很快. ...

  2. 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...

  3. BZOJ1059或洛谷1129 [ZJOI2007]矩阵游戏

    BZOJ原题链接 洛谷原题链接 通过手算几组例子后,很容易发现,同一列的\(1\)永远在这一列,且这些\(1\)有且仅有一个能产生贡献,行同理. 所以我们可以只考虑交换列,使得每一行都能匹配一个\(1 ...

  4. 洛谷P3164 [CQOI2014]和谐矩阵

    高斯消元,可以直接消的 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...

  5. P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)

    题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...

  6. BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)

    Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本 身,及他上下左右的4个元素(如果存在). 给定矩阵的行数和列数,请计算并输 ...

  7. 洛谷P1397 [NOI2013]矩阵游戏

    矩阵快速幂+费马小定理 矩阵也是可以跑费马小定理的,但是要注意这个: (图是盗来的QAQ) 就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了 #include< ...

  8. 【洛谷P1129】矩阵游戏

    题目大意:给定一个 N*N 的矩阵,有些格子是 1,其他格子是 0.现在允许交换若干次行和若干次列,求是否可能使得矩阵的主对角线上所有的数字都是1. 题解:首先发现,交换行和交换列之间是相互独立的.主 ...

  9. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

随机推荐

  1. git和github菜鸟使用步骤

    刚刚在windows7下安装完git.奉上安装步骤. git安装 安装git程序.运行以下操作: 1. $ cd ~/.ssh    //检查计算机ssh密钥 2.假设没有提示:No such fil ...

  2. bootstrap-table 行内编辑

    1.文件引入 <link rel="stylesheet" href="bootstrap.css"> <link rel="sty ...

  3. CMTime 与 CMTimeMakeWithSeconds

    1.首先先看代码,这段代码的作用就是要让视频播放区域有个封面.不会显的太空当. - (void)avPlayerDidPlayed:(NSNotification *)noti { [_avPlaye ...

  4. 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊

    转自:http://data.qq.com/article?id=817 三.Hermes设计概要 架构描述 系统核心进程均采用分散化设计,根据业务发展需求,可随意扩缩容机器; 周期性数据直接通过td ...

  5. 《UML和模式应用》读书笔记(一)

    一.绪论 1. 面向对象分析和设计 1.1 什么是分析和设计 分析(analysis)强调的是对问题和需求的调查研究,而不是解决方案. 设计(design)强调的是满足需求的概念上的解决方案,而不是其 ...

  6. Fast RCNN中RoI的映射关系

    写在前面:下面讨论中Kernel Size为奇数,因为这样才能方便一致的确认Kernel中心. 在Fast RCNN中,为了大大减少计算量,没有进行2k次运算前向运算,而是进行了1次运算,然后在从po ...

  7. javascript之闭包,递归,深拷贝

    闭包 理解:a函数执行后return出b函数且b函数可以访问a函数的数据 好处:子函数存储在复函数内部,子函数执行完不会被自动销毁 坏处:占用内存比较大 ex: function bibao(){ v ...

  8. python3 分布式进程(跨机器)BaseManager(multiprocessing.managers)

    A机器负责发送任务和接受结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #ta ...

  9. TX2 刷机过程

    1.拿到板子,上电 (1)输入 ls (2)进入NVIDIA-INSTALLER/ (3)再sudo ./installer.sh 账户和密码都是:nvidia (4)sudo reboot 参考博客 ...

  10. PHP程序中的redis一些写法

    <?php /** * 以下均要先链接好redis */ sdk\libs\RedisHelper::connect("s1")->keys('*'); //这个是获取 ...