「一本通 6.5 例 1」矩阵 A×B

GitHub跳转原题关系图返回列表

按矩阵乘法定义,三重循环直接计算结果矩阵每个元素。

OJ: roj

题目 ID: 1641

难度:入门

标签:矩阵模拟

创建: 2026-09-30 23:31

更新: 2026-10-06 01:29

题目描述

给定 n×mn \times m 矩阵 AA 与 m×pm \times p 矩阵 BB,按定义 cij=∑k=1maikbkjc_{ij}=\sum_{k=1}^{m} a_{ik}b_{kj} 输出 n×pn \times p 的结果矩阵 CC。数据范围:1≤n,m,p≤1001 \le n,m,p \le 100,元素绝对值不超过 10410^4。

思路

直接按定义枚举 i,j,ki,j,k 三重循环,计算 AA 的第 ii 行与 BB 的第 jj 列的点积;结果与中间乘积用 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;
}