#include <vector> #include <iostream> #include <algorithm> using namespace std; const int INF = 1012345678; const int D = 100'000'000; vector<int> solve(int N, const vector<vector<int> >& A) { vector<vector<int> > B(N); for (int i = 0; i < N; i++) { B[i].resize(i + 1); } for (int i = 0; i < N; i++) { vector<int> v(i + 1); int target = 0; for (int j = i; j >= 0; j--) { if (j != i) { target = (target + B[(N - i) + j][j]) % D; } v[j] = (A[(N - i - 1) + j][j] - target + D) % D; } sort(v.begin(), v.end()); v.push_back(v[0] + D); pair<int, int> opt = {-INF, -1}; for (int j = 0; j <= i; j++) { opt = max(opt, {v[j + 1] - v[j], j}); } int center = ((v[opt.second] + v[opt.second + 1]) / 2 + D / 2) % D; B[N - 1][i] = center; for (int j = i - 1; j >= 0; j--) { B[(N - i - 1) + j][j] = (B[(N - i) + j][j] + B[(N - i) + j][j + 1]) % D; } } return B[N - 1]; } int get_score(int N, const vector<vector<int> >& A, const vector<int>& ans) { vector<vector<int> > B(N); B[N - 1] = ans; for (int i = N - 2; i >= 0; i--) { B[i].resize(i + 1); for (int j = 0; j <= i; j++) { B[i][j] = (B[i + 1][j] + B[i + 1][j + 1]) % D; } } int score = -INF; for (int i = 0; i < N; i++) { for (int j = 0; j <= i; j++) { int d = abs(B[i][j] - A[i][j]); d = min(d, D - d); score = max(score, d); } } return D / 2 - score; } int main() { int N; cin >> N; vector<vector<int> > A(N); for (int i = 0; i < N; i++) { A[i].resize(i + 1); for (int j = 0; j <= i; j++) { cin >> A[i][j]; } } vector<int> ans = solve(N, A); for (int i = 0; i < N; i++) { if (i != 0) { cout << ' '; } cout << ans[i]; } cout << endl; cerr << "score: " << get_score(N, A, ans) << endl; return 0; }