hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场

简介:

Matrix multiplication

                                                                          Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

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≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals A ij. The next n lines describe the matrix B in similar format (0≤A ij,B ij≤10 9).
 

Output
For each tests:

Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
 

Sample Input

  
  
1 0 1 2 0 1 2 3 4 5 6 7
 

Sample Output

  
  
0 0 1 2 1
 
题意:给出两个n*n的矩阵,求这两个矩阵的乘积。结果对3取余。
分析:拿到题先用了经典的矩阵相乘的方法,提交以后果断超时了。后来在网上搜了一下矩阵相乘优化,找到了一个优化方法,仅仅可惜如今我还没有理解是怎么优化的。

哭

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 805;
int a[N][N], b[N][N], ans[N][N];
void  Multi(int n)
{
    int  i, j, k, L, *p2;
    int  tmp[N], con;
    for(i = 0; i < n; ++i)
    {
        memset(tmp, 0, sizeof(tmp));
        for(k = 0, L = (n & ~15); k < L; ++k)
        {
            con = a[i][k];
            for(j = 0, p2 = b[k]; j < n; ++j, ++p2)
                tmp[j] += con * (*p2);
            if((k & 15) == 15)
            {
                for(j = 0; j < n; ++j) tmp[j] %= 3;
            }
        }

        for( ; k < n; ++k)
        {
            con = a[i][k];
            for(j = 0, p2 = b[k]; j < n; ++j, ++p2)
                tmp[j] += con * (*p2);
        }
        for(j = 0; j < n; ++j)
            ans[i][j] = tmp[j] % 3;
    }
}
int main()
{
    int n, i, j, k;
    while(~scanf("%d",&n))
    {
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
            {
                scanf("%d",&a[i][j]);
                a[i][j] %= 3;
            }
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
            {
                scanf("%d",&b[i][j]);
                b[i][j] %= 3;
            }
        Multi(n);
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < n-1; j++)
                printf("%d ", ans[i][j]);
            printf("%d\n", ans[i][n-1]);
        }
    }
    return 0;
}

http://blog.csdn.net/gogdizzy/article/details/9003369这里面解说了矩阵相乘的优化方法。

以下这样的方法也能够过:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 805;
int a[N][N], b[N][N], ans[N][N];
int main()
{
    int n, i, j, k;
    while(~scanf("%d",&n))
    {
        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(ans, 0, sizeof(ans));
        for(k = 1; k <= n; k++) //经典算法中这层循环在最内层,放最内层会超时。可是放在最外层或者中间都不会超时。不知道为什么
            for(i = 1; i <= n; i++)
                for(j = 1; j <= n; j++)
                {
                    ans[i][j] += a[i][k] * b[k][j];
                    //ans[i][j] %= 3;   //假设在这里对3取余,就超时了
                }
        for(i = 1; i <= n; i++)
        {
            for(j = 1; j < n; j++)
                printf("%d ", ans[i][j] % 3);
            printf("%d\n", ans[i][n] % 3);
        }
    }
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4756900.html,如需转载请自行联系原作者


相关文章
|
8月前
PTA-矩阵转置
该代码实现将输入的3x3矩阵转置并按指定格式输出。输入为9个小于100的整数,用空格分隔,输出转置后的矩阵。示例输入:1 2 3 4 5 6 7 8 9,输出:1 4 7\n2 5 8\n3 6 9。代码使用`map(int,input().split())`读取输入,然后通过for循环按格式打印转置后的矩阵。
77 0
codeforces 289 B. Polo the Penguin and Matrix
题目意思是在n*m的矩阵中,你可以对矩阵中的每个数加或者减d,求最少的操作次数,使得矩阵中所有的元素相同。 虽然在condeforces中被分到了dp一类,但完全可以通过排序,暴力的方法解决。
45 0
|
机器学习/深度学习 C++
【PAT甲级 - C++题解】1105 Spiral Matrix
【PAT甲级 - C++题解】1105 Spiral Matrix
71 0
|
机器学习/深度学习 C++
【PAT甲级 - C++题解】1059 Prime Factors
【PAT甲级 - C++题解】1059 Prime Factors
85 0
|
C++
【PAT甲级 - C++题解】1081 Rational Sum
【PAT甲级 - C++题解】1081 Rational Sum
100 0
|
人工智能
Codeforces1343D - Constant Palindrome Sum + UPC-鸭子游戏 (差分)
Codeforces1343D - Constant Palindrome Sum + UPC-鸭子游戏 (差分)
109 1
|
BI
2020ICPC济南站 A . Matrix Equation (高斯消元)
2020ICPC济南站 A . Matrix Equation (高斯消元)
109 0
2020ICPC济南站 A . Matrix Equation (高斯消元)
|
人工智能
CodeForces-Kuroni and Impossible Calculation(思维+鸽巢原理)
CodeForces-Kuroni and Impossible Calculation(思维+鸽巢原理)
95 0
【1105】Spiral Matrix (25分)【螺旋矩阵】
【1105】Spiral Matrix (25分)【螺旋矩阵】 【1105】Spiral Matrix (25分)【螺旋矩阵】
127 0
HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)
HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)
132 0

热门文章

最新文章