#include using namespace std; using ll = long long; const int MOD = 1e8; const int N = 50; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); vector> A(N), B(N); vector base(N); int mod(int x) { return ((x % MOD) + MOD) % MOD; } int compute_error(int a, int b) { int diff = abs(a - b); return min(diff, MOD - diff); } void compute_pyramid() { for (int i = N - 2; i >= 0; --i) { for (int j = 0; j <= i; ++j) { B[i][j] = mod(B[i + 1][j] + B[i + 1][j + 1]); } } } int evaluate() { compute_pyramid(); int max_error = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j <= i; ++j) { max_error = max(max_error, compute_error(A[i][j], B[i][j])); } } return 5e7 - max_error; } void solve() { // 入力 for (int i = 0; i < N; ++i) { A[i].resize(i + 1); B[i].resize(i + 1); for (int j = 0; j <= i; ++j) { cin >> A[i][j]; } } // 初期解: 最下段を与えられた最上段の値から推定 for (int i = 0; i < N; ++i) base[i] = A[N-1][i]; B[N-1] = base; int best_score = evaluate(); vector best_base = base; auto start_time = chrono::steady_clock::now(); double TIME_LIMIT = 1.9; // 1.9秒で打ち切る while (true) { auto now = chrono::steady_clock::now(); double elapsed = chrono::duration(now - start_time).count(); if (elapsed > TIME_LIMIT) break; // 局所探索: 1つの要素をランダムに変更 int idx = rng() % N; int delta = (rng() % 20001) - 10000; // -10000 から 10000の範囲で調整 int old_value = base[idx]; base[idx] = mod(base[idx] + delta); B[N-1] = base; int new_score = evaluate(); if (new_score > best_score) { best_score = new_score; best_base = base; } else { base[idx] = old_value; } } // 最良の解を出力 for (int i = 0; i < N; ++i) { cout << best_base[i] << " "; } cout << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); return 0; }