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. git初使用的心得

    转到Java方向后,版本控制工具也开始以git为主了.由于之前不怎么使用bash,所以目前还是以ui工具,比如sourcetree为主导,但一些简单的操作命令,已经能够快速地使用.sourcetree ...

  2. 08使用NanoPiM1Plus在Android4.4.2下接TF卡

    08使用NanoPiM1Plus在Android4.4.2下接TF卡 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本: ...

  3. Apache ab使用指南

    Apache ab使用图例: 其中比较重要的两个指标要特别注意: Requests per second:表示平均每秒事务数,相当于LR的TPS Time per second:用户请求平均响应时间和 ...

  4. 学习RFT之:TestObject.find方法的了解与使用

    第一部分:了解TestObject.find 一.TestObject.find方法的作用 1.测试过程中动态的找到测试对象(控件.标签等),使我们的测试用例不再依赖RFT自带的对象地图(Object ...

  5. Apache JServ protocol服务 怎么关闭?

      Apache JServ protocol  =  AJP 解决方案:修改tomcat 的service.xml配置文件 将 <Connector port="8009" ...

  6. 用Docker构建Nginx镜像

    1构建Nginx镜像 1建立工作目录 [root@localhost ]# mkdir 1nginx [root@localhost 1nginx]# cd 1nginx/ [root@localho ...

  7. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  8. 模板—splay

    #include<iostream> #include<cstdio> #define cin(x) scanf("%d",&x) using na ...

  9. php第二十六节课

    会话购物车 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. 诊断:ORA-38760: This database instance failed to turn on flashback database

    $ oerr ora 38760 38760, 00000, "This database instance failed to turn on flashback database&quo ...