HDU 4920 水

矩阵乘法

因为答案要MOD3,所以矩阵中会有很多值为0,对这些不乘就行了,,,,,,,这样也能水过。。。

BUT :

这样写会超时:
            for (int i=1; i<=n; i++)
                for (int j=1; j<=n; j++)
                    for (int k=1; k<=n; k++)
                        c[i][j]+=a[i][k]*b[k][j];

这样写就能过:

        for (int k=1; k<=n; k++)
            for (int i=1; i<=n; i++)
                for (int j=1; j<=n; j++)
                    c[i][j]+=a[i][k]*b[k][j];
BECAUSE:
我们知道内存中二维数组是以行为单位连续存储的,逐列访问将会每次跳1000*4(bytes)。根据cpu cache的替换策略,将会有大量的cache失效。
时间居然会相差很多。 可见利用好cpu cache优化我们的程序,是非常有必要掌握的技能。
平时写程序时,也应当尽量使cpu对内存的访问,是尽可能连续的。

#include "stdio.h"
#include "string.h"
int a[810][810],b[810][810],c[810][810];
int main()
{
    int n,i,j,k;

    while (scanf("%d",&n)!=EOF)
    {
        for (i=1;i<=n;i++)
            for (j=1;j<=n;j++)
            {
                scanf("%d",&a[i][j]);
                a[i][j]%=3;
            }

        for (i=1;i<=n;i++)
            for (j=1;j<=n;j++)
            {
                scanf("%d",&b[i][j]);
                b[i][j]%=3;
            }

        memset(c,0,sizeof(c));

        for (k=1;k<=n;k++)
            for (i=1;i<=n;i++)
            if (a[i][k]!=0)
                for (j=1;j<=n;j++)
                {
                    c[i][j]+=a[i][k]*b[k][j]%3;

                }
        for (i=1;i<=n;i++)
        {
            for (j=1;j<n;j++)
                printf("%d ",c[i][j]%3);
            printf("%d\n",c[i][j]%3);
        }

    }
    return 0;
}

HDU 4920 水

时间: 2024-10-10 11:10:06

HDU 4920 水的相关文章

HDU 4920 Matrix multiplication

Problem Description Given two matrices A and B of size n×n, find the product of them. bobo hates big integers. So you are only asked to find the result modulo 3. Input The input consists of several tests. For each tests: The first line contains n (1≤

hdu 4920 Matrix multiplication (矩阵计算)

题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 const in

HDU 4968 (水dp 其他?)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

矩阵乘法 --- hdu 4920 : Matrix multiplication

Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 820    Accepted Submission(s): 328 Problem Description Given two matrices A and B of size n×n, find the product of them. b

2014多校联合五(HDU 4911 HDU 4915 HDU 4920)

HDU 4911 Inversion 题意:n个数字  通过k次相邻交换  使得逆序对数最少 思路:如果序列为 XXXABYYY  假设A和B位置互换  易知X和AB.Y和AB的逆序对数不变  换句话说一次交换最多使逆序对减少1  那么只需要求原逆序对数和k进行比较即可 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100100 type

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

hdu 4920 Matrix multiplication(矩阵乘法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 989    Accepted Submission(s): 396 Problem Description Given two matr

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 <cstdi

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画