#100. 矩阵乘法
内存限制:256 MiB时间限制:2000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名
题目描述
这是一道模板题。
分别给定 n×p n imes pn×p 和 p×m p imes mp×m 的两个矩阵 A AA 和 B BB,求 A×B A imes 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 imes 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 ^ 91≤n,p,m≤500, −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(" "); } return 0; }