結果
| 問題 | No.62 リベリオン(Extra) | 
| コンテスト | |
| ユーザー |  maine_honzuki | 
| 提出日時 | 2020-05-10 12:26:08 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 107 ms / 5,000 ms | 
| コード長 | 2,428 bytes | 
| コンパイル時間 | 1,687 ms | 
| コンパイル使用メモリ | 168,372 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-07 12:59:57 | 
| 合計ジャッジ時間 | 2,527 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 3 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll W, H, D, Vx, Vy;
ll gcd(ll a, ll b) {
    while (b) {
        ll c = b;
        b = a % b;
        a = c;
    }
    return a;
}
ll lcm(ll a, ll b) {
    if (!a || !b)
        return 0;
    return a * b / gcd(a, b);
}
ll extgcd(ll a, ll b, ll& x, ll& y) {
    if (b) {
        ll d = extgcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    } else {
        x = 1;
        y = 0;
        return a;
    }
}
ll rem(ll& a, ll b) {
    return ((a %= b) += b) %= b;
}
__int128 rem(__int128& a, ll b) {
    return ((a %= b) += b) %= b;
}
bool hit(ll Mx, ll My) {
    ll My_origin = My;
    ll w = 2 * W, h = 2 * H;
    ll a, b;
    ll g = extgcd(Vx, 2 * W, a, b);
    if (Mx % g)
        return false;
    rem(a, w);
    a *= Mx / g;
    rem(a, w / g);
    ll can_add_to_a = w / g;
    My -= Vy * (a % (h));
    rem(My, h);
    if (My == 0) {
        return a <= D;
    }
    ll c, d;
    g = extgcd(Vy * can_add_to_a, h, c, d);
    assert(Vy * can_add_to_a * c + h * d == g);
    c *= can_add_to_a;
    if (My % g) return false;
    rem(c, lcm(h / gcd(h, Vy), can_add_to_a));
    __int128 tmp_c = c;
    ll times_c = My / g;
    rem(times_c, lcm(h / gcd(h, Vy), can_add_to_a));
    tmp_c *= times_c;
    rem(tmp_c, lcm(h / gcd(h, Vy), can_add_to_a));
    c = tmp_c;
    return c + a <= D;
}
int main() {
    int Q;
    cin >> Q;
    while (Q--) {
        ll Mx, My, Hx, Hy;
        cin >> W >> H >> D >> Mx >> My >> Hx >> Hy >> Vx >> Vy;
        ll g = gcd(abs(Vx), abs(Vy));
        Vx /= g;
        Vy /= g;
        D *= g;
        if (Vx < 0) {
            Vx *= -1;
            Hx = W - Hx;
            Mx = W - Mx;
        }
        if (Vy < 0) {
            Vy *= -1;
            Hy = H - Hy;
            My = H - My;
        }
        Vx %= 2 * W;
        Vy %= 2 * H;
        ll mx, my;
        bool ans = false;
        for (int i = 0; i < 4; i++) {
            if (i < 2)
                mx = Mx;
            else
                mx = W * 2 - Mx;
            if (i % 2 == 0)
                my = My;
            else
                my = H * 2 - My;
            mx -= Hx;
            my -= Hy;
            if (mx < 0)
                mx += W * 2;
            if (my < 0)
                my += H * 2;
            bool flag = hit(mx, my);
            ans |= flag;
        }
        cout << (ans ? "Hit" : "Miss") << endl;
    }
}
            
            
            
        