HDU 4920 Matrix multiplication(bitset)
来源:互联网 发布:淘宝运动鞋店铺 编辑:程序博客网 时间:2024/05/17 03:58
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;}
1 0
- HDU 4920 Matrix multiplication(bitset)
- HDU 4920 Matrix multiplication 暴力(bitset)
- Matrix multiplication(bitset)
- hdu 4920 Matrix multiplication
- HDU 4920 Matrix multiplication
- hdu 4920 Matrix multiplication
- HDU 4920 Matrix multiplication
- HDU 4920 Matrix multiplication
- HDU-4920-Matrix multiplication
- HDU 4920 Matrix multiplication
- HDU-4920 Matrix multiplication
- hdu 4920 Matrix multiplication(高效)
- HDU 4920 (Matrix multiplication)
- HDU4920:Matrix multiplication(思维 & bitset)
- HDU 4920 Matrix multiplication(矩阵乘法)
- hdu 4920 Matrix multiplication (矩阵相乘)
- HDU 4920 Matrix multiplication(矩阵相乘)
- hdu 4920 Matrix multiplication(矩阵乘法)
- hadoop分析之一HDFS元数据解析
- 数组指针(二级指针的第二种内存模型)
- zoj1655 spfa 最长路径
- 南阳理工_小光棍数
- Goldbach's Conjecture(数论)
- HDU 4920 Matrix multiplication(bitset)
- sscanf的使用
- Android 下拉刷新框架实现
- 算法导论 第6章 堆排序(简单选择排序、堆排序)
- CentOS6.5 将用户添加到sudoers里
- lihnux特殊装置 loop 挂载
- unable to bind to property 'money' on class 'Object' (class is not an IEventDispatcher)
- catalina.sh设置JAVA_HOME后还无法解决更换JDK有关问题
- KGLHD