結果
| 問題 | No.62 リベリオン(Extra) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-14 21:13:48 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 38 ms / 5,000 ms |
| + 561µs | |
| コード長 | 1,579 bytes |
| 記録 | |
| コンパイル時間 | 2,498 ms |
| コンパイル使用メモリ | 335,716 KB |
| 実行使用メモリ | 9,304 KB |
| 最終ジャッジ日時 | 2026-08-14 21:13:52 |
| 合計ジャッジ時間 | 3,627 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = __int128_t;
ll gcd(ll a, ll b) {return (a % b ? gcd(b, a % b) : b);}
void ext_gcd(ll A, ll B, ll &x, ll &y) {
if(B == 0) x = 1, y = 0;
else {ext_gcd(B, A % B, y, x); y -= A / B * x;}
}
int solve() {
int64_t aW, aH, aD, aMx, aMy, aHx, aHy, aVx, aVy;
cin >> aW >> aH >> aD >> aMx >> aMy >> aHx >> aHy >> aVx >> aVy;
ll W = aW, H = aH, D = aD, Mx = aMx, My = aMy, Hx = aHx, Hy = aHy, Vx = aVx, Vy = aVy;
H *= 2, W *= 2;
if(Vx < 0) Vx = -Vx, Mx = W - Mx, Hx = W - Hx;
if(Vy < 0) Vy = -Vy, My = H - My, Hy = H - Hy;
if(Vy == 0) swap(W, H), swap(Mx, My), swap(Hx, Hy), swap(Vx, Vy);
if(Vx == 0) {
const ll dist = (My < Hy ? H * 2 - Hy - My : My - Hy);
cout << (Mx == Hx and dist <= D * Vy ? "Hit" : "Miss") << "\n";
return 0;
}
ll X = Vy * W, Y = Vx * H;
ll G = gcd(X, Y);
X /= G, Y /= G;
ll sX = 0, sY = 0;
ext_gcd(X, Y, sX, sY);
while(sX < 0) sX += Y, sY -= X;
sY *= -1;
const auto calc = [&](ll mx, ll my) ->ll {
mx = (mx - Hx + W) % W, my = (my - Hy + H) % H;
ll t = Vx * my - Vy * mx;
if(t % G) return 1e18;
t /= G;
if(t == 0) return (mx + Vx - 1) / Vx;
ll kx = sX * t, ky = sY * t;
const ll cnt = min(kx / Y, ky / X);
kx -= cnt * Y, ky -= cnt * X;
while(kx < 0 or ky < 0) kx += Y, ky += X;
return (kx * W + mx + Vx - 1) / Vx;
};
const ll ans = min({calc(Mx, My), calc(W - Mx, My), calc(Mx, H - My), calc(W - Mx, H - My)});
cout << (ans <= D ? "Hit" : "Miss") << "\n";
return 0;
}
int main() {
int Q;
cin >> Q;
while(Q--) if(solve()) return 1;
return 0;
}