算法
(构造) $O(n^2)$
我们可以先找出矩阵 $c$ 的第一列中的最小元素在哪一行,记为 $r$,然后让数组 $b = c[r]$,再通过 $a[i] = c[i][0] - b[0]$ 算出 $a$ 数组。最后检验一下是否所有的 $a_i$ 和 $b_j$ 都满足条件即可。
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using std::cin;
using std::cout;
using std::vector;
int main() {
int n;
cin >> n;
vector<vector<int>> c(n, vector<int>(n));
rep(i, n)rep(j, n) cin >> c[i][j];
vector<int> a(n), b(n);
int r = 0;
rep(i, n) if (c[i][0] < c[r][0]) r = i;
b = c[r];
rep(i, n) a[i] = c[i][0] - b[0];
rep(i, n)rep(j, n) {
if (c[i][j] != a[i] + b[j]) {
puts("No");
return 0;
}
}
puts("Yes");
rep(i, n) cout << a[i] << " \n"[i == n - 1];
rep(i, n) cout << b[i] << " \n"[i == n - 1];
return 0;
}