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)的更多相关文章

  1. HDU 4920 Matrix multiplication(bitset优化)

    题目链接 Matrix multiplication 求矩阵A和B相乘的结果. 因为答案只要对3取模,所以我们可以通过一些方法来加速计算. 我们对两个矩阵各开两个bitset,分别存储模3余1和模3余 ...

  2. hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场

    Matrix multiplication                                                                           Time ...

  3. HDU 4920 Matrix multiplication (硬件优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 解题报告:求两个800*800的矩阵的乘法. 参考这篇论文:http://wenku.baidu ...

  4. hdu - 4920 - Matrix multiplication(缓存优化+开挂)

    题意:求两个n x n的矩阵相乘后模3的结果,n <= 800. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 -->>呀呀 ...

  5. hdu 4920 Matrix multiplication (矩阵计算)

    题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. #include <iostr ...

  6. 2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

    题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据 ...

  7. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  8. HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. HDU 4920 Matrix multiplication(矩阵相乘)

    各种TEL,233啊.没想到是处理掉0的情况就能够过啊.一直以为会有极端数据.没想到居然是这种啊..在网上看到了一个AC的奇妙的代码,经典的矩阵乘法,仅仅只是把最内层的枚举,移到外面就过了啊...有点 ...

随机推荐

  1. Android RxJava 2.0中backpressure(背压)概念的理解

    英文原文:https://github.com/ReactiveX/RxJava/wiki/Backpressure Backpressure(背压.反压力) 在rxjava中会经常遇到一种情况就是被 ...

  2. C语言特殊知识点解析

    1 数组 1.1 概念 数组是指某种数据类型,在内存上按照顺序存储.中括号([ ])是数组的标识,中括号内的数值标识该种数据类型变量的个数,中括号也有取值的作用. 1.2 数组使用 int a[10] ...

  3. HTML——meta

    http://www.cnblogs.com/jr1993/p/4542862.html

  4. 【DVWA】【SQL Injection(Blind)】SQL盲注 Low Medium High Impossible

    1.初级篇 Low.php 加单引号提交 http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1'&Submit=Submi ...

  5. 【前端路由】Vue-router 中hash模式和history模式的区别

    咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...

  6. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  7. Java集合(一)--Comparable和Comparator

    Comparable: 是集合内部的方法实现的排序,只有一个方法 public interface Comparable<T> { public int compareTo(T o); } ...

  8. 洛谷——P2827 蚯蚓

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \lfloor c \rfloor⌊c⌋ 表示对 cc 向下取整,例如:\lfloor 3.0 \rfloor = \lfloor 3.1 \rflo ...

  9. Luogu P3110 [USACO14DEC]驮运Piggy Back

    解题思路 看到下面很多人都在说什么遇到了之后要不要背着走,其实根本不需要,同样的我也是跑了三遍$SPFA$,求出了以$1$为起点到个点的$dist$,和以$2$为起点到个点的$dist$,还有以$n$ ...

  10. UVA-1599 Ideal Path(双向BFS)

    题目: 给一个n个点m条边(2≤m≤100000, 1≤m≤200000)的无向图,每条边上都涂有一种颜色(用1到1000000000表示).求从结点1到结点n的一条路径, 使得经过的边数尽量少,在此 ...