#100. 矩陣乘法

自為風月馬前卒發表於2017-11-08

#100. 矩陣乘法

記憶體限制:256 MiB時間限制:2000 ms標準輸入輸出
題目型別:傳統評測方式:文字比較
上傳者: 匿名

題目描述

這是一道模板題。

分別給定 n×p n \times pn×p 和 p×m p \times mp×m 的兩個矩陣 A AA 和 B BB,求 A×B A \times BA×B。

輸入格式

第一行三個正整數 n nn、p pp、m mm,表示矩陣的長寬。
之後的 n nn 行,每行 p pp 個整數,表示矩陣 A AA。
之後的 p pp 行,每行 m mm 個整數,表示矩陣 B BB。

輸出格式

輸出 n nn 行,每行 m mm 個整數,表示矩陣 A×B A \times BA×B,每個數模 109+7 10 ^ 9 + 7109​​+7 輸出。

樣例

樣例輸入

3 4 5
-2 -8 -9 8
-10 0 6 -8
-10 -6 6 9
4 -7 5 -5 9
10 -2 -10 5 5
-3 -7 -3 8 -2
-6 7 7 3 -2

樣例輸出

999999898 149 153 999999929 999999951
999999997 999999979 999999883 74 999999921                                                                                                                                                   
999999835 103 55 95 999999857

資料範圍與提示

1≤n,p,m≤500, −109≤Ai,j,Bi,j≤109 1 \leq n, p, m \leq 500,\ -10 ^ 9 \leq A_{i, j}, B_{i, j} \leq 10 ^ 91n,p,m500, 109​​Ai,j​​,Bi,j​​109​​

分類標籤

 
 
 
zhx說矩陣乘法的時候把k放在外面會有玄學優化?

上面那個是k在外面的,貌似真有玄學優化?:astonished:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long 
using namespace std;
const int MAXN=1001;
const int mod=1e9+7;
inline int read()
{
	char c=getchar();int flag=1,x=0;
	while(c<'0'||c>'9')	{if(c=='-')	flag=-1;c=getchar();}
	while(c>='0'&&c<='9')	x=x*10+c-48,c=getchar();return x*flag;
}
int n,p,m;
long long int a[MAXN][MAXN];
long long int b[MAXN][MAXN];
long long int c[MAXN][MAXN];
int main()
{
	n=read();p=read();m=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=p;j++)
			a[i][j]=read(),a[i][j]=(a[i][j]%mod+mod)%mod;
	for(int i=1;i<=p;i++)
		for(int j=1;j<=m;j++)
			b[i][j]=read(),b[i][j]=(b[i][j]%mod+mod)%mod;
	for(int k=1;k<=p;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				c[i][j]=( c[i][j]+(a[i][k]*b[k][j])%mod )%mod;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			printf("%lld ",c[i][j]);
		printf("\n");
	}
	return 0;
}

  

相關文章