結果

問題 No.3245 Payment with 8-rep Currency
ユーザー ripity
提出日時 2025-08-22 22:28:41
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 245 ms / 2,000 ms
コード長 1,278 bytes
コンパイル時間 5,268 ms
コンパイル使用メモリ 334,932 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-08-22 22:29:01
合計ジャッジ時間 15,754 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

#include <atcoder/all>
using namespace atcoder;

using ll = long long;
using mint = modint998244353;

using T = array<ll, 4>;
map<ll, T> mp;

void precalc() {
    for(ll A = 0; A <= 1111; A++) {
        for(ll B = 0; B <= 101; B++) {
            for(ll C = 0; C <= 11; C++) {
                ll N = A * 8 + B * 88 + C * 888;
                if(2 * max({A, B, C}) >= (A + B + C)) continue;
                mp[N] = T{A, B, C, 0};
            }
        }
    }
}

void solve() {
    ll N;
    cin >> N;
    if(N % 8 != 0) {
        cout << -1 << "\n";
        return;
    }
    if(N < 8888) {
        if(mp.count(N)) {
            auto [A, B, C, D] = mp[N];
            cout << A << " " << B << " " << C << " " << D << "\n";
        }else {
            cout << -1 << "\n";
        }
    }else {
        ll p = N / 8888;
        ll q = (N % 8888) / 8;
        ll x = q / 12;
        ll A = 2 * p + q - 11 * x;
        ll B = 10 * p + x;
        ll C = 9 * p;
        ll D = 0;
        cout << A << " " << B << " " << C << " " << D << "\n";
        assert(8 * A + 88 * B + 888 * C + 8888 * D == N);
        assert(2 * max({A, B, C}) < (A + B + C));
    }
}

int main() {
    precalc();
    int T;
    cin >> T;
    while(T--) solve();
}
0