結果

問題 No.3682 きあいのハチマキ
コンテスト
ユーザー rarula
提出日時 2026-09-10 04:05:37
言語 C++23(gcc16)
(gcc 16.1.0 + boost 1.92.0 + ACL)
コンパイル:
g++-16 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 26 ms / 2,000 ms
+ 742µs
コード長 3,325 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,496 ms
コンパイル使用メモリ 351,276 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-09-10 04:05:43
合計ジャッジ時間 4,363 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 2
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#include <cassert>
#define endl '\n'
using namespace std;
using ll = long long;

template<ll M> struct modint {
    ll v = 0;
    ll val() const {
        return v;
    }
    modint(ll v = 0) : v((v % M + M) % M) {}
    modint operator+() const {
        return *this;
    }
    modint operator-() const {
        return modint() - *this;
    }
    modint& operator+=(const modint &r) {
        if ((v += r.v) >= M) v -= M;
        return *this;
    }
    modint& operator-=(const modint &r) {
        if ((v += M - r.v) >= M) v -= M;
        return *this;
    }
    modint& operator*=(const modint &r) {
        v *= r.v;
        v %= M;
        return *this;
    }
    modint& operator/=(const modint &r) {
        return *this *= r.inv();
    }
    modint& operator++() {
        (*this) += 1;
        return *this;
    }
    modint& operator--() {
        (*this) -= 1;
        return *this;
    }
    modint operator++(int) {
        modint res = *this;
        ++(*this);
        return res;
    }
    modint operator--(int) {
        modint res = *this;
        --(*this);
        return res;
    }
    modint pow(ll n) const {
        modint x = *this;
        modint res = 1;
        while (n > 0) {
            if (n & 1) res *= x;
            x *= x;
            n >>= 1;
        }
        return res;
    }
    modint inv() const {
        return pow(M-2);
    }
    friend modint operator+(const modint &l, const modint &r) {
        return modint(l) += r;
    }
    friend modint operator-(const modint &l, const modint &r) {
        return modint(l) -= r;
    }
    friend modint operator*(const modint &l, const modint &r) {
        return modint(l) *= r;
    }
    friend modint operator/(const modint &l, const modint &r) {
        return modint(l) /= r;
    }
    friend bool operator==(const modint &l, const modint &r) {
        return l.v == r.v;
    }
    friend bool operator!=(const modint &l, const modint &r) {
        return l.v != r.v;
    }
};
using mint = modint<998244353>;

ll ceildiv(ll a, ll b) {
    assert(b != 0);
    ll q = a / b;
    ll r = a % b;
    if (r != 0 && ((a > 0) == (b > 0))) q++;
    return q;
}

void solve() {
    ll h1, a1, s1, h2, a2, s2;
    cin >> h1 >> a1 >> s1 >> h2 >> a2 >> s2;

    auto f = [](ll h1, ll a1, ll h2, ll a2) -> mint {
        ll atk_cnt1 = ceildiv(h2, a1) - 1;
        ll atk_cnt2 = ceildiv(h1, a2) - 1;
        ll lead = 0;
        bool flip = false;
        if (atk_cnt1 <= atk_cnt2) {
            lead = atk_cnt2 - atk_cnt1;
        } else {
            lead = (atk_cnt1 - 1) - atk_cnt2;
            flip = true;
            swap(h1, h2);
            swap(a1, a2);
        }

        mint p = mint(10).inv().pow(lead);
        mint q = (mint(1) - p) + p * (mint(10) / mint(11));
        return flip ? mint(1) - q : q;
    };

    if (s1 == s2) {
        mint ans = f(h1, a1, h2, a2) / mint(2) + (mint(1) - f(h2, a2, h1, a1)) / mint(2);
        cout << ans.val() << endl;
        return;
    }
    else if (s1 > s2) {
        cout << f(h1, a1, h2, a2).val() << endl;
    }
    else {
        cout << (mint(1) - f(h2, a2, h1, a1)).val() << endl;
    }

    return;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}
0