HDU 4920 Matrix multiplication(bitset)
HDU 4920 Matrix multiplication
题意:给定两个矩阵,求这两个矩阵相乘mod 3
思路:没什么好的想法,就把0的位置不考虑。结果就过了。然后看了官方题解,上面是用了bitset这个东西,能够用来存大的二进制数,那么对于行列相乘。事实上就几种情况,遇到0都是0了,1 1得1,2 1,1 2得2,2 2得1。所以仅仅要存下行列1和2存不存在分别表示的二进制数。然后取且bitcount一下的个数,就能够计算出对应的数值了
代码:
暴力:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; inline void scanf_(int &num)//无负数
{
char in;
while((in = getchar()) > '9' || in < '0') ;
num = in - '0';
while(in = getchar(),in >= '0' && in <= '9')
num *= 10,num += in - '0';
} const int N = 805; int n; int a[N][N], av[N][N], an[N], b[N][N], bv[N][N], bn[N], c[N][N]; int main() {
while (~scanf("%d", &n)) {
int num;
memset(an, 0, sizeof(an));
memset(bn, 0, sizeof(bn));
memset(c, 0, sizeof(c));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf_(num);
num %= 3;
if (num == 0) continue;
av[j][an[j]] = i;
a[j][an[j]++] = num;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf_(num);
num %= 3;
if (num == 0) continue;
bv[i][bn[i]] = j;
b[i][bn[i]++] = num;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < an[i]; j++) {
for (int k = 0; k < bn[i]; k++) {
int x = av[i][j], y = bv[i][k];
c[x][y] = (c[x][y] + a[i][j] * b[i][k]) % 3;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++)
printf("%d ", c[i][j]);
printf("%d\n", c[i][n - 1]);
}
}
return 0;
}
bitset:
#include <cstdio>
#include <cstring>
#include <string>
#include <bitset>
using namespace std; const int N = 805;
int n, num;
bitset<800> row[N][2], col[N][2]; int main() {
while (~scanf("%d", &n)) {
for (int i = 0; i < n; i++) {
row[i][0].reset();
row[i][1].reset();
col[i][0].reset();
col[i][1].reset();
for (int j = 0; j < n; j++) {
scanf("%d", &num);
if (num % 3 == 1)
row[i][0].set(j, 1);
if (num % 3 == 2)
row[i][1].set(j, 1);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &num);
if (num % 3 == 1)
col[j][0].set(i, 1);
if (num % 3 == 2)
col[j][1].set(i, 1);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int ans = 0;
ans += (row[i][0]&col[j][0]).count();
ans += 2 * (row[i][1]&col[j][0]).count() + 2 * (row[i][0]&col[j][1]).count();
ans += (row[i][1]&col[j][1]).count();
printf("%d%c", ans % 3, j == n - 1 ? '\n' : ' ');
}
}
}
return 0;
}
HDU 4920 Matrix multiplication(bitset)的更多相关文章
- HDU 4920 Matrix multiplication(bitset优化)
题目链接 Matrix multiplication 求矩阵A和B相乘的结果. 因为答案只要对3取模,所以我们可以通过一些方法来加速计算. 我们对两个矩阵各开两个bitset,分别存储模3余1和模3余 ...
- hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场
Matrix multiplication Time ...
- HDU 4920 Matrix multiplication (硬件优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 解题报告:求两个800*800的矩阵的乘法. 参考这篇论文:http://wenku.baidu ...
- hdu - 4920 - Matrix multiplication(缓存优化+开挂)
题意:求两个n x n的矩阵相乘后模3的结果,n <= 800. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 -->>呀呀 ...
- hdu 4920 Matrix multiplication (矩阵计算)
题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. #include <iostr ...
- 2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)
题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据 ...
- hdu 4920 Matrix multiplication bitset优化常数
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- HDU 4920 Matrix multiplication(矩阵相乘)
各种TEL,233啊.没想到是处理掉0的情况就能够过啊.一直以为会有极端数据.没想到居然是这种啊..在网上看到了一个AC的奇妙的代码,经典的矩阵乘法,仅仅只是把最内层的枚举,移到外面就过了啊...有点 ...
随机推荐
- 漫谈未来的HDFS
前面我们提到的HDFS,了解了HDFS的特性和架构.HDFS能够存储TB甚至PB规模的数据是有前提的,首先数据要以大文件为主,其次NameNode的内存要足够大.对HDFS有所了解的同学肯定都知道,N ...
- Mac使用之常用快捷键
正式工作了,公司配给了mac,很多命令跟windows有很大不同,为了自己更好的使用mac本,特此记录平时常用的快捷键命令. 1.复制.保存等:command+c/s等,与windows不同的是ctr ...
- Android基础夯实--重温动画(一)之Tween Animation
心灵鸡汤:真正成功的人生,不在于成就的大小,而在于你是否努力地去实现自我,喊出自己的声音,走出属于自己的道路. 摘要 不积跬步,无以至千里:不积小流,无以成江海.学习任何东西我们都离不开扎实的基础知识 ...
- Tcl之Read files for synthesis
The following file is to read all design files into syntehsis tool automatically, like Cadence RTL C ...
- (独孤九剑)--cURL
[一]概论 日常开发里,cURL使用最多的协议就是HTTP协议的GET.POST请求,其他协议和请求方式用的较少. [二]开启 开发前检验是否开启了cURL模块,开启方法为php.int中打开exte ...
- Spring Boot 缓存的基本用法
目录 一.目的 二.JSR-107 缓存规范 三.Spring 缓存抽象 四.Demo 1.使用 IDEA 创建 Spring Boot 项目 2.创建相应的数据表 3.创建 Java Bean 封装 ...
- 行内块+calc+margin 三列布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 监听微信端,手机端,ios端的浏览器返回事件,pc端关闭事件
直接上代码了,可以监听微信端,手机端,iOS端的浏览器返回事件,关闭事件不支持 当进入该页面,我们就给这个history压入一个本地的连接.当点击返回.后退及上一页的操作时,就进行监听,在监听代码中实 ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...
- ZOJ - 3993 - Safest Buildings (数学)
参考:https://blog.csdn.net/KuHuaiShuXia/article/details/78408194 题意: 描述了吃鸡刷圈的问题,给出楼的坐标点,和两次刷圈的半径R和r,现在 ...