#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秒で打ち切る double temperature = 1e6; // 初期温度を調整 double decay = 0.995; // 減衰率を変更 while (true) { auto now = chrono::steady_clock::now(); double elapsed = chrono::duration(now - start_time).count(); if (elapsed > TIME_LIMIT) break; // 誤差が大きい部分を優先的に変更 int idx = rng() % N; int old_value = base[idx]; int change_range = max(1, int(temperature)); base[idx] = mod(old_value + (rng() % (2 * change_range + 1)) - change_range); B[N-1] = base; int new_score = evaluate(); int diff = new_score - best_score; if (diff > 0 || exp((double)diff / temperature) > uniform_real_distribution<>(0.0, 1.0)(rng)) { if (new_score > best_score) { best_score = new_score; best_base = base; } } else { base[idx] = old_value; } temperature *= decay; } // 最良の解を出力 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; }