[Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵
洛谷传送门
BZOJ传送门
题目描述
我们称一个由000和111组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的111。一个元素相邻的元素包括它本身,及他上下左右的444个元素(如果存在)。给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为000的矩阵是不允许的。
输入输出格式
输入格式:
输入一行,包含两个空格分隔的整数mmm和nnn,分别表示矩阵的行数和列数。
输出格式:
输出包含mmm行,每行nnn个空格分隔整数(000或111),为所求矩阵。测试数据保证有解。
输入输出样例
输入样例#1:
4 4
输出样例#1:
0 1 0 0
1 1 1 0
0 0 0 1
1 1 0 1
说明
数据范围
1≤m,n≤401 \le m, n \le 401≤m,n≤40
解题分析
首先我们可以暴力高斯消元, 因为是异或方程组, 可以用bitsetbitsetbitset优化,复杂度是O((nm)332)O(\frac{(nm)^3}{32})O(32(nm)3), 的确能过…
然而这里有一种更优雅的写法: 我们发现只要确定第一行的元素就可以确定整个表的元素, 而整个表有合法解的必要条件为第n+1n+1n+1行元素递推出来全部为000。那么我们先O(nm)O(nm)O(nm)递推出第n+1n+1n+1行元素对应的第一行的元素组成, 这样就可以列出mmm个mmm元方程, 进而解出得到第一行的元素, 最后再递推一次即可。
总复杂度O(m3)O(m^3)O(m3)。
代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstdlib>
#include <bitset>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 45
#define ll long longint n, m;
ll tran[MX][MX];
std::bitset <MX> mat[MX], ans[MX];void Gauss()
{for (R int i = 1; i <= m; ++i){for (R int j = i; j <= m; ++j)if (mat[j][i]) {std::swap(mat[j], mat[i]); break;}if (!mat[i][i]) continue;for (R int j = i + 1; j <= m; ++j) if (mat[j][i]) mat[j] ^= mat[i];}for (R int i = m; i; --i){ans[1][i] = mat[i][i] ? mat[i][m + 1] : 1;if (ans[1][i]) for (R int j = 1; j < i; ++j) if (mat[j][i]) mat[j][m + 1] = !mat[j][m + 1];}
}int main(void)
{scanf("%d%d", &n, &m);for (R int i = 1; i <= m; ++i) tran[1][i] = 1ll << i;for (R int i = 2; i <= n + 1; ++i)for (R int j = 1; j <= m; ++j)tran[i][j] = tran[i - 1][j - 1] ^ tran[i - 1][j] ^ tran[i - 1][j + 1] ^ tran[i - 2][j];for (R int i = 1; i <= m; ++i)for (R int j = 1; j <= m; ++j) mat[i][j] = (tran[n + 1][i] >> j) & 1;Gauss();for (R int i = 2; i <= n; ++i)for (R int j = 1; j <= m; ++j)ans[i][j] = ans[i - 1][j - 1] ^ ans[i - 1][j] ^ ans[i - 1][j + 1] ^ ans[i - 2][j];for (R int i = 1; i <= n; ++i){for (R int j = 1; j <= m; ++j) printf("%d ", (int)ans[i][j]);puts("");}
}
[Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵相关推荐
- bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)
3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Submit: 1101 Solved ...
- bzoj3503: [Cqoi2014]和谐矩阵
高斯消元解异或方程组.学了bitset.对比如下 #include<cstdio> #include<cstring> #include<iostream> #in ...
- [CQOI2014]和谐矩阵
嘟嘟嘟 遇到这种(看似)构造的题,我好像一般都做不出来-- 然而这题正解是高斯消元解异或方程组-- 首先我们容易列出式子a[i][j] ^ a[i - 1][j] ^ a[i + 1][j] ^ a[ ...
- bzoj3503【CQOI2014】和谐矩阵
3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Submit: 841 Solv ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...
- JZOJ 3596. 【CQOI2014】和谐矩阵
Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果存在). 给定矩阵的行数和列数,请计算并输出 ...
- 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组
#include <stdio.h> int main() {puts("转载请注明出处");puts("地址:blog.csdn.net/vmurder/a ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1407 Solved: 703 [Submit][Statu ...
- [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】
题目链接:BZOJ - 1048 题目分析 感觉这种分割矩阵之类的题目很多都是这样子的. 方差中用到的平均数是可以直接算出来的,然后记忆化搜索 Solve(x, xx, y, yy, k) 表示横坐标 ...
- bzoj 3504: [Cqoi2014]危桥(最大流)
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1660 Solved: 823 [Submit][Statu ...
最新文章
- Python 统计列表中元素出现的次数
- 南昌理工学院计算机网络技术专业怎么样,南昌理工学院怎么样 重点专业是什么...
- java队列,ArrayBlockingQueue
- 【小知识点】分类机器学习中,某一标签占比太大(标签稀疏),如何学习?...
- Python制作代码雨
- webservice视频教程-基于SOA 思想下的WebService实战
- 金融行业,保险行业软件测试分析
- win7录屏_专业电脑录屏方法有哪些?分享录屏靠谱方法!
- 韦根协议-C编程实现
- UCB——上界置信算法
- java抢红包_Java 用Redis 实现抢红包功能
- 好佳居窗帘十大品牌 窗帘的发展故事
- 小程序使用 企业微信客户服务插件(联系我) contactPlugin
- [Excel]如何去除恼人的外部链接
- LPN管理中涉及到的LPN过多不能释放,导致在调拨环节零散LPN太多,如何解决该问题?
- egret新手引导反向遮罩
- 联想智能云:“三级火箭”战略加持下的云时代整合服务商
- 【通俗易懂的通信】信源的相关性和剩余度(冗余度)
- Vue extends拓展任意组件功能(el-select实例)-两种写法
- 痴狂青年孙正义竟然按50年规划行事