HDU 4920 Matrix multiplication

题目链接

题意:给定两个矩阵,求这两个矩阵相乘mod 3

思路:没什么好的想法,就把0的位置不考虑。结果就过了。然后看了官方题解,上面是用了bitset这个东西,能够用来存大的二进制数,那么对于行列相乘。事实上就几种情况,遇到0都是0了,1 1得1,2 1,1 2得2,2 2得1。所以仅仅要存下行列1和2存不存在分别表示的二进制数。然后取且bitcount一下的个数,就能够计算出对应的数值了

代码:

暴力:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. inline void scanf_(int &num)//无负数
  8. {
  9. char in;
  10. while((in = getchar()) > '9' || in < '0') ;
  11. num = in - '0';
  12. while(in = getchar(),in >= '0' && in <= '9')
  13. num *= 10,num += in - '0';
  14. }
  15.  
  16. const int N = 805;
  17.  
  18. int n;
  19.  
  20. int a[N][N], av[N][N], an[N], b[N][N], bv[N][N], bn[N], c[N][N];
  21.  
  22. int main() {
  23. while (~scanf("%d", &n)) {
  24. int num;
  25. memset(an, 0, sizeof(an));
  26. memset(bn, 0, sizeof(bn));
  27. memset(c, 0, sizeof(c));
  28. for (int i = 0; i < n; i++) {
  29. for (int j = 0; j < n; j++) {
  30. scanf_(num);
  31. num %= 3;
  32. if (num == 0) continue;
  33. av[j][an[j]] = i;
  34. a[j][an[j]++] = num;
  35. }
  36. }
  37. for (int i = 0; i < n; i++) {
  38. for (int j = 0; j < n; j++) {
  39. scanf_(num);
  40. num %= 3;
  41. if (num == 0) continue;
  42. bv[i][bn[i]] = j;
  43. b[i][bn[i]++] = num;
  44. }
  45. }
  46. for (int i = 0; i < n; i++) {
  47. for (int j = 0; j < an[i]; j++) {
  48. for (int k = 0; k < bn[i]; k++) {
  49. int x = av[i][j], y = bv[i][k];
  50. c[x][y] = (c[x][y] + a[i][j] * b[i][k]) % 3;
  51. }
  52. }
  53. }
  54. for (int i = 0; i < n; i++) {
  55. for (int j = 0; j < n - 1; j++)
  56. printf("%d ", c[i][j]);
  57. printf("%d\n", c[i][n - 1]);
  58. }
  59. }
  60. return 0;
  61. }

bitset:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <bitset>
  5. using namespace std;
  6.  
  7. const int N = 805;
  8. int n, num;
  9. bitset<800> row[N][2], col[N][2];
  10.  
  11. int main() {
  12. while (~scanf("%d", &n)) {
  13. for (int i = 0; i < n; i++) {
  14. row[i][0].reset();
  15. row[i][1].reset();
  16. col[i][0].reset();
  17. col[i][1].reset();
  18. for (int j = 0; j < n; j++) {
  19. scanf("%d", &num);
  20. if (num % 3 == 1)
  21. row[i][0].set(j, 1);
  22. if (num % 3 == 2)
  23. row[i][1].set(j, 1);
  24. }
  25. }
  26. for (int i = 0; i < n; i++) {
  27. for (int j = 0; j < n; j++) {
  28. scanf("%d", &num);
  29. if (num % 3 == 1)
  30. col[j][0].set(i, 1);
  31. if (num % 3 == 2)
  32. col[j][1].set(i, 1);
  33. }
  34. }
  35. for (int i = 0; i < n; i++) {
  36. for (int j = 0; j < n; j++) {
  37. int ans = 0;
  38. ans += (row[i][0]&col[j][0]).count();
  39. ans += 2 * (row[i][1]&col[j][0]).count() + 2 * (row[i][0]&col[j][1]).count();
  40. ans += (row[i][1]&col[j][1]).count();
  41. printf("%d%c", ans % 3, j == n - 1 ?
  42.  
  43. '\n' : ' ');
  44. }
  45. }
  46. }
  47. return 0;
  48. }

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. 面向过程与面向对象引入三大特性&&事务

    1.面向过程 int a = 10;int b =5;int c = a+b; int r1 = 10;int r2 = 5;double c = r1*r1*3.14 - r2*r2*3.14 缺点 ...

  2. 构建一个.net的干货类库,以便于快速的开发 - 前言

    前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...

  3. Python学习日记之中文支持

    解决中文输出错误 在开头添加 # -*- coding: utf-8 -*- 即可

  4. [转]MapReduce浅析

    本文转自http://edisonchou.cnblogs.com/ 一.什么是MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大 ...

  5. [转]最值得拥有的免费Bootstrap后台管理模板

    在PHP开发项目中,后台管理因为面向群体相对比较固定,大部分以实现业务逻辑和功能.使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间.下面PHP程序员 ...

  6. 梦想CAD控件COM接口文字样式

    增加文字样式 用户可以增加文字样式到数据库,并设置其字体等属性,具体实现c#代码如下: private void CreateText() { MxDrawApplication app = new ...

  7. oracle中的冷热备份

    oracle有四种备份方法:冷备份.热备份.RMAN备份.逻辑备份. 其中冷备份和热备份都是用操作系统命令对oracle文件直接进行拷贝, 不同的是冷备份是把数据库关闭后再备份,备份过程中也要关闭数据 ...

  8. 巧用TWaver 3D 矢量图形功能

    的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...

  9. c/c++编程排坑(1)-- 数据类型的“安静”转换

    这里主要介绍ANSI C的特性:当执行算术运算时,操作数的类型如果不同,就会发生转换.数据类型一般朝着精度更高.长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则 ...

  10. linux网络编程——域名转换 gethostbyname与gethostbyaddr

    域名转换 #include <netdb.h> struct hostent *gethostbyname(const char *name); 参数: name: 执行主机名的指针 返回 ...