矩阵乘法
发布时间: 2017年8月31日 21:36 最后更新: 2017年9月3日 00:03 时间限制: 1000ms 内存限制: 127M
这是一道模板题。
分别给定 n×p 和 p×m 的两个矩阵 A 和 B ,求 A×B 。
第一行三个正整数
n
、
p
、
m
,表示矩阵的长宽。
之后的
n
行,每行
p
个整数,表示矩阵
A
。
之后的
p
行,每行
m
个整数,表示矩阵
B
。
输出 n 行,每行 m 个整数,表示矩阵 A×B ,每个数模 109+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#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 500 + 10; const int N1 = 1000000000 + 7; long long e[N][N], e1[N][N], ans[N][N]; int main(){ int n, m, p; while(scanf("%d%d%d", &n, &p, &m) != EOF){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= p; j++){ ans[i][j] = N1; } } memset(e, 0, sizeof(e)); memset(e1, 0, sizeof(e1)); for(int i = 1; i <= n; i++){ for(int j = 1; j <= p; j++){ scanf("%lld", &e[i][j]); e[i][j] %= N1; } } for(int i = 1; i <= p; i++){ for(int j = 1; j <= m; j++){ scanf("%lld", &e1[i][j]); e1[i][j] %= N1; } } long long t, t1; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ t = N1; for(int k = 1; k <= p; k++){ t1 = e[i][k] * e1[k][j]; t += t1; //t = (t + e[i][k] * e1[k][j]); t %= N1; } ans[i][j] = t % N1; } } bool flag = true; for(int i = 1; i <= n; i++){ flag = true; for(int j = 1; j <= m; j++){ if(flag) flag = false; else printf(" "); if(ans[i][j] < 0) printf("%lld", (ans[i][j] + N1) % N1); else printf("%lld", ans[i][j] % N1); } printf("\n"); } } return 0; }
1≤n,p,m≤500 , −109≤Ai,j,Bi,j≤109
AC代码: