• 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
    ", 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 ?

    ' ' : ' '); } } } return 0; }



  • 相关阅读:
    洛谷 P4114 Qtree1
    洛谷 P2486 [SDOI2011]染色
    洛谷 P1505 [国家集训队]旅游
    洛谷 P4281 [AHOI2008]紧急集合 / 聚会
    C++中main函数的返回值一定要是int
    局部变量作为函数返回值
    sizeof和strlen在string类中的使用
    strlen 和 sizeof 的区别
    数据结构中的堆栈和内存中的堆栈问题
    数据类型的字长,字节问题
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7137339.html
Copyright © 2020-2023  润新知