按矩阵乘法定义,三重循环直接计算结果矩阵每个元素。
OJ: roj
题目 ID: 1641
难度:入门
标签:矩阵模拟
创建: 2026-09-30 23:31
更新: 2026-10-06 01:29
题目描述
给定
思路
直接按定义枚举 long long 避免溢出。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-30 23:33
# update_at: 2026-09-30 23:33
import sys
def matrix_multiply(a: list[list[int]], b: list[list[int]], n: int, m: int, p: int) -> list[list[int]]:
"""计算 n×m 矩阵 A 与 m×p 矩阵 B 的乘积,返回 n×p 结果矩阵。"""
# 转置 B 为 p×m,方便按行向量点积
b_cols = [[b[k][j] for k in range(m)] for j in range(p)]
return [
[sum(a[i][k] * b_cols[j][k] for k in range(m)) for j in range(p)]
for i in range(n)
]
def solve() -> None:
data = iter(map(int, sys.stdin.buffer.read().split()))
try:
n = next(data)
except StopIteration:
return
m = next(data)
a = [[next(data) for _ in range(m)] for _ in range(n)]
p = next(data)
b = [[next(data) for _ in range(p)] for _ in range(m)]
c = matrix_multiply(a, b, n, m, p)
for row in c:
print(*(row))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-06 01:29
* update_at: 2026-10-06 01:29
*/
#include <cstdio>
typedef long long ll;
const int MAXN = 105;
ll a[MAXN][MAXN]; // 矩阵 A,n 行 m 列
ll b[MAXN][MAXN]; // 矩阵 B,m 行 p 列
ll c[MAXN][MAXN]; // 结果矩阵 C,n 行 p 列
int main() {
int n, m, p;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%lld", &a[i][j]);
}
}
scanf("%d", &p);
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= p; j++) {
scanf("%lld", &b[i][j]);
}
}
// 按定义计算 C[i][j] = sum_{k=1}^{m} A[i][k] * B[k][j]
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= p; j++) {
ll sum = 0;
for (int k = 1; k <= m; k++) {
sum += a[i][k] * b[k][j];
}
c[i][j] = sum;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= p; j++) {
printf("%lld", c[i][j]);
if (j < p) printf(" ");
}
printf("\n");
}
return 0;
}