結果
| 問題 | No.3682 きあいのハチマキ |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-10 04:05:37 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 26 ms / 2,000 ms |
| + 742µs | |
| コード長 | 3,325 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}