1 条题解
-
0
思路与算法
先读 及 的矩阵 ,再读 和 的矩阵 。结果有 行 列。逐个输出位置 ,沿公共维度 累加 。这里 在矩阵 之后输入,不得按其它版本在首行读三个维度。
矩阵元素可以为负。单项绝对值至 ,最多累加100项,结果绝对值可达 ,故输入元素、乘法和累加器都采用64位整数。每算完一行按列输出,不必另存整个结果矩阵。
正确性说明
固定结果位置 。内层循环处理完前 项时,累加器恰为 :初始零对应空和,每次增加下一项保持不变式。结束时得到定义要求的点积。外层枚举全部 个位置,每个位置计算一次,故输出恰为 。64位范围覆盖所有中间部分和,不会改变整数结果。
复杂度
存储数组初始化和输入耗时 ,每个输出位置累加 项,耗时 ,输出 。总时间 ,正维度下可简为 。额外空间 ,结果逐项输出无需 缓存。
易错点
- 公共维度是 ,结果为 ,不要颠倒 、 或拿 作为累加上限。
- 要在读完 后再读取。矩阵乘法通常不可交换。
- 乘法前就使用64位,不能先以32位算乘积再转换。
- 覆盖非方阵、维度1、正负抵消以及正负 结果。按行输出并保留负号。
- 训练数据来源和自编边界均非官方原版;独立答案以任意精度外积累加核验。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, p; cin >> n >> m; vector<vector<ll>> a(n, vector<ll>(m)); for (auto &row : a) for (ll &x : row) cin >> x; cin >> p; vector<vector<ll>> b(m, vector<ll>(p)); for (auto &row : b) for (ll &x : row) cin >> x; for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) { ll value = 0; for (int k = 0; k < m; k++) value += a[i][k] * b[k][j]; if (j) cout << ' '; cout << value; } cout << '\n'; } }
- 1