HDU

来源:互联网 发布:网络教育培训机构 编辑:程序博客网 时间:2024/05/21 02:19

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920

题目大意:求两个方阵的乘积

解题思路:普通的求矩阵乘积,注意乘积过程的优化以及不要乱取模

AC代码:

#include<cstdio>#include<cstring>using namespace std;const int Max = 800 + 5;const int Mod = 3;int bulk;int matrix[Max][Max];int a[Max][Max], b[Max][Max];void multi(int matrix1[][Max], int matrix2[][Max], int _bulk){    for (int i = 1;i <= _bulk;++i)        for (int k = 1;k <= _bulk;++k)        {            if (!matrix1[i][k]) continue;//这里是优化的第一个方阵的0,所对应的第二个方阵的位置都不用去乘了,所以要改变一下j,k的循环位置            for (int j = 1;j <= _bulk;++j)                matrix[i][j] += matrix1[i][k] * matrix2[k][j];//这里加几个取模运算也会超时        }}int main(){    for (int n;scanf("%d", &n) == 1;)    {        for (int i = 1;i <= n;++i)            for (int j = 1;j <= n;++j)            {                scanf("%d", &a[i][j]);                a[i][j] %= Mod;                matrix[i][j] = 0;            }        for (int i = 1;i <= n;++i)            for (int j = 1;j <= n;++j)            {                scanf("%d", &b[i][j]);                b[i][j] %= Mod;            }        multi(a, b, n);        for (int i = 1;i <= n;++i)        {            printf("%d", matrix[i][1]%Mod);            for (int j = 2;j <= n;++j)                printf(" %d", matrix[i][j]%Mod);            puts("");        }    }    return 0;}
原创粉丝点击