結果

問題 No.61 リベリオン
ユーザー gew1fw
提出日時 2025-06-12 15:26:12
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 7,929 bytes
コンパイル時間 269 ms
コンパイル使用メモリ 82,768 KB
実行使用メモリ 86,476 KB
最終ジャッジ日時 2025-06-12 15:26:37
合計ジャッジ時間 1,179 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 2 WA * 2
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import math

def extended_gcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = extended_gcd(b % a, a)
        return (g, x - (b // a) * y, y)

def solve():
    input = sys.stdin.read().split()
    idx = 0
    Q = int(input[idx])
    idx += 1
    for _ in range(Q):
        W = int(input[idx])
        H = int(input[idx+1])
        D = int(input[idx+2])
        Mx = int(input[idx+3])
        My = int(input[idx+4])
        Hx = int(input[idx+5])
        Hy = int(input[idx+6])
        Vx = int(input[idx+7])
        Vy = int(input[idx+8])
        idx += 9
        
        hit = False
        
        for s_x in [1, -1]:
            for s_y in [1, -1]:
                if Vx == 0 and Vy == 0:
                    continue
                
                if Vx == 0:
                    numerator = Hx - s_x * Mx
                    denominator = 2 * W
                    if denominator == 0:
                        continue
                    if numerator % denominator != 0:
                        continue
                    a = numerator // denominator
                    
                    if Vy == 0:
                        continue
                    else:
                        C = (s_y * My - Hy) * Vx - (s_x * Mx - Hx) * Vy
                        A = 2 * W * Vy
                        B = -2 * H * Vx
                        G = math.gcd(A, B)
                        if C % G != 0:
                            continue
                        A_prime = A // G
                        B_prime = B // G
                        C_prime = C // G
                        
                        g, x0, y0 = extended_gcd(A_prime, B_prime)
                        if (C_prime % g) != 0:
                            continue
                        x0 *= (C_prime // g)
                        y0 *= (C_prime // g)
                        
                        a0 = x0
                        b0 = y0
                        
                        a_gen = a0 + B_prime * 0
                        b_gen = b0 - A_prime * 0
                        
                        t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx if Vx != 0 else (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if Vx == 0:
                            t = (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if Vy == 0:
                            t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx
                        if Vx == 0 and Vy == 0:
                            continue
                        
                        if t > 0 and t <= D:
                            hit = True
                            break
                elif Vy == 0:
                    numerator = Hy - s_y * My
                    denominator = 2 * H
                    if denominator == 0:
                        continue
                    if numerator % denominator != 0:
                        continue
                    b = numerator // denominator
                    
                    if Vx == 0:
                        continue
                    else:
                        C = (s_y * My - Hy) * Vx - (s_x * Mx - Hx) * Vy
                        A = 2 * W * Vy
                        B = -2 * H * Vx
                        G = math.gcd(A, B)
                        if C % G != 0:
                            continue
                        A_prime = A // G
                        B_prime = B // G
                        C_prime = C // G
                        
                        g, x0, y0 = extended_gcd(A_prime, B_prime)
                        if (C_prime % g) != 0:
                            continue
                        x0 *= (C_prime // g)
                        y0 *= (C_prime // g)
                        
                        a0 = x0
                        b0 = y0
                        
                        a_gen = a0 + B_prime * 0
                        b_gen = b0 - A_prime * 0
                        
                        t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx if Vx != 0 else (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if Vx == 0:
                            t = (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if Vy == 0:
                            t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx
                        if Vx == 0 and Vy == 0:
                            continue
                        
                        if t > 0 and t <= D:
                            hit = True
                            break
                else:
                    A = 2 * W * Vy
                    B = -2 * H * Vx
                    C = (s_y * My - Hy) * Vx - (s_x * Mx - Hx) * Vy
                    
                    G = math.gcd(A, B)
                    if C % G != 0:
                        continue
                    
                    A_prime = A // G
                    B_prime = B // G
                    C_prime = C // G
                    
                    g, x0, y0 = extended_gcd(A_prime, B_prime)
                    if (C_prime % g) != 0:
                        continue
                    
                    x0 *= (C_prime // g)
                    y0 *= (C_prime // g)
                    
                    a0 = x0
                    b0 = y0
                    
                    a_gen = a0 + B_prime * 0
                    b_gen = b0 - A_prime * 0
                    
                    t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx
                    if Vy != 0:
                        t_y = (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if abs(t - t_y) > 1e-9:
                            continue
                    
                    if t > 0 and t <= D:
                        hit = True
                        break
                    
                    k_min = None
                    k_max = None
                    
                    delta_a = B_prime
                    delta_b = -A_prime
                    
                    if delta_a == 0 and delta_b == 0:
                        continue
                    
                    if (A_prime == 0 and B_prime == 0):
                        continue
                    
                    t = (s_x * Mx - Hx + a_gen * 2 * W) / Vx
                    if Vy != 0:
                        t_y = (s_y * My - Hy + b_gen * 2 * H) / Vy
                        if abs(t - t_y) > 1e-9:
                            continue
                    
                    if t > 0 and t <= D:
                        hit = True
                        break
                    
                    if delta_a != 0:
                        a_prev = a_gen - delta_a
                        t_prev = (s_x * Mx - Hx + a_prev * 2 * W) / Vx
                        if t_prev <= t:
                            k_min = 0
                            k_max = 1
                        else:
                            k_min = -1
                            k_max = 0
                    else:
                        k_min = -1
                        k_max = 0
                    
                    for k in range(k_min, k_max + 1):
                        a = a0 + B_prime * k
                        b = b0 - A_prime * k
                        
                        t = (s_x * Mx - Hx + a * 2 * W) / Vx
                        if Vy != 0:
                            t_y = (s_y * My - Hy + b * 2 * H) / Vy
                            if abs(t - t_y) > 1e-9:
                                continue
                        
                        if t > 0 and t <= D:
                            hit = True
                            break
                    if hit:
                        break
            if hit:
                break
        
        if hit:
            print("Hit")
        else:
            print("Miss")

if __name__ == '__main__':
    solve()
0