結果
問題 | No.62 リベリオン(Extra) |
ユーザー | t98slider |
提出日時 | 2022-05-17 12:08:47 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,648 bytes |
コンパイル時間 | 5,066 ms |
コンパイル使用メモリ | 386,012 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-15 06:22:49 |
合計ジャッジ時間 | 6,154 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 1 ms
5,376 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
ソースコード
#include <bits/stdc++.h> #include <boost/multiprecision/cpp_int.hpp> using namespace std; using namespace boost::multiprecision; tuple<int1024_t,int1024_t,int1024_t> ext_gcd(int1024_t p, int1024_t q){ if(q == 0)return make_tuple(p, 1, 0); int1024_t g, x, y; tie(g, y, x) = ext_gcd(q, p % q); return make_tuple(g, x, y - (p / q) * x); } int1024_t igcd(int1024_t a, int1024_t b){ return b == 0 ? a : igcd(b, a % b); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int1024_t W, H, D, Mx, My, Hx, Hy, Vx, Vy; auto solve = [&](int1024_t Vx, int1024_t Vy, int1024_t Sx, int1024_t Sy, int1024_t Dx, int1024_t Dy){ int1024_t x, y, g, A, B, C, D, XX, YY, Bx, By; int1024_t gg, gg1, gg2; g = igcd(Vx, Vy); Vx /= g, Vy /= g; Sx %= Dx; Sy %= Dy; if(Sx < 0)Sx += Dx; if(Sy < 0)Sy += Dy; A = Dx * Vy, B = Dy * Vx, C = Vx * Sy - Vy * Sx; g = igcd(A, B); if(C % g != 0)return false; A /= g, B /= g, C /= g; tie(g, x, y) = ext_gcd(A, B); Bx = C * x, By = -C * y; gg1 = Bx / B, gg2 = By / A; gg = gg1 < gg2 ? gg1 : gg2; Bx -= gg * B, By -= gg * A; while(Bx >= B && By >= A)Bx -= B, By -= A; while(Bx < 0 || By < 0)Bx += B, By += A; x = Sx + Bx * Dx; y = Sy + By * Dy; return (x <= Vx && y <= Vy); }; int t; cin >> t; while(t--){ cin >> W >> H >> D >> Mx >> My >> Hx >> Hy >> Vx >> Vy; if(Vx < 0){ Mx = W - Mx, Hx = W - Hx, Vx = -Vx; } if(Vy < 0){ My = H - My, Hy = H - Hy, Vy = -Vy; } if(Vx == 0){ if((Mx == Hx) && ((My >= Hy && My - Hy <= D * Vy) || (My < Hy && 2 * H - My - Hy <= D * Vy))){ cout << "Hit" << '\n'; }else{ cout << "Miss" << '\n'; } continue; } if(Vy == 0){ if((My == Hy) && ((Mx >= Hx && Mx - Hx <= D * Vx) || (Mx < Hx && 2 * W - Mx - Hx <= D * Vx))){ cout << "Hit" << '\n'; }else{ cout << "Miss" << '\n'; } continue; } int1024_t Rx = 2 * W - Mx, Ry = 2 * H - My; if(solve(Vx * D, Vy * D, Mx - Hx, My - Hy, 2 * W, 2 * H) || solve(Vx * D, Vy * D, Rx - Hx, My - Hy, 2 * W, 2 * H) || solve(Vx * D, Vy * D, Mx - Hx, Ry - Hy, 2 * W, 2 * H) || solve(Vx * D, Vy * D, Rx - Hx, Ry - Hy, 2 * W, 2 * H)){ cout << "Hit" << '\n'; }else{ cout << "Miss" << '\n'; } } }