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的奇妙的代码,经典的矩阵乘法,仅仅只是把最内层的枚举,移到外面就过了啊...有点 ...
随机推荐
- 面向过程与面向对象引入三大特性&&事务
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 缺点 ...
- 构建一个.net的干货类库,以便于快速的开发 - 前言
前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...
- Python学习日记之中文支持
解决中文输出错误 在开头添加 # -*- coding: utf-8 -*- 即可
- [转]MapReduce浅析
本文转自http://edisonchou.cnblogs.com/ 一.什么是MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大 ...
- [转]最值得拥有的免费Bootstrap后台管理模板
在PHP开发项目中,后台管理因为面向群体相对比较固定,大部分以实现业务逻辑和功能.使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间.下面PHP程序员 ...
- 梦想CAD控件COM接口文字样式
增加文字样式 用户可以增加文字样式到数据库,并设置其字体等属性,具体实现c#代码如下: private void CreateText() { MxDrawApplication app = new ...
- oracle中的冷热备份
oracle有四种备份方法:冷备份.热备份.RMAN备份.逻辑备份. 其中冷备份和热备份都是用操作系统命令对oracle文件直接进行拷贝, 不同的是冷备份是把数据库关闭后再备份,备份过程中也要关闭数据 ...
- 巧用TWaver 3D 矢量图形功能
的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...
- c/c++编程排坑(1)-- 数据类型的“安静”转换
这里主要介绍ANSI C的特性:当执行算术运算时,操作数的类型如果不同,就会发生转换.数据类型一般朝着精度更高.长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则 ...
- linux网络编程——域名转换 gethostbyname与gethostbyaddr
域名转换 #include <netdb.h> struct hostent *gethostbyname(const char *name); 参数: name: 执行主机名的指针 返回 ...