結果

問題 No.62 リベリオン(Extra)
ユーザー raven7959raven7959
提出日時 2022-08-25 23:48:13
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,424 bytes
コンパイル時間 199 ms
コンパイル使用メモリ 82,204 KB
実行使用メモリ 78,648 KB
最終ジャッジ日時 2024-10-13 04:27:49
合計ジャッジ時間 1,428 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 37 ms
52,992 KB
testcase_01 AC 37 ms
52,992 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

from math import gcd

def inv_gcd(a, b):
    a = a % b
    if a == 0:
        return (b, 0)
    s = b
    t = a
    m0 = 0
    m1 = 1
    while(t):
        u = s//t
        s -= t*u
        m0 -= m1*u
        s, t = t, s
        m0, m1 = m1, m0
    if m0 < 0:
        m0 += b//s
    return (s, m0)

def inv_mod(x, m):
    assert 1 <= m
    z = inv_gcd(x, m)
    assert z[0] == 1
    return z[1]

def crt(r, m):
    assert len(r) == len(m)
    n = len(r)
    r0 = 0
    m0 = 1
    for i in range(n):
        assert 1 <= m[i]
        r1 = r[i] % m[i]
        m1 = m[i]
        if m0 < m1:
            r0, r1 = r1, r0
            m0, m1 = m1, m0
        if (m0 % m1 == 0):
            if (r0 % m1 != r1):
                return (0, 0)
            continue
        g, im = inv_gcd(m0, m1)
        u1 = m1//g
        if ((r1-r0) % g):
            return (0, 0)
        x = (r1-r0)//g % u1*im % u1
        r0 += x*m0
        m0 *= u1
        if r0 < 0:
            r0 += m0
    return (r0, m0)


Q=int(input())
for _ in range(Q):
    W,H,D,MX,MY,HX,HY,VX,VY=map(int,input().split())
    if VX==0:
        if MX!=HX:
            print("Miss")
        else:
            if VY>0:
                if MY>HY:
                    if D*VY>=MY-HY:
                        print("Hit")
                    else:
                        print("Miss")
                else:
                    if D*VY>=2*(H-HY)+HY-MY:
                        print("Hit")
                    else:
                        print("Miss")
            else:
                if MY>HY:
                    if -D*VY>=2*HY+MY-HY:
                        print("Hit")
                    else:
                        print("Miss")
                else:
                    if -D*VY>=2*MY+HY-MY:
                        print("Hit")
                    else:
                        print("Miss")
        continue
    if VY==0:
        if MY!=HY:
            print("Miss")
        else:
            if VX>0:
                if MX>HX:
                    if D*VX>=MX-HX:
                        print("Hit")
                    else:
                        print("Miss")
                else:
                    if D*VX>=2*(W-HX)+HX-MX:
                        print("Hit")
                    else:
                        print("Miss")
            else:
                if MX>HX:
                    if -D*VX>=2*HX+MX-HX:
                        print("Hit")
                    else:
                        print("Miss")
                else:
                    if -D*VX>=2*MX+HX-MX:
                        print("Hit")
                    else:
                        print("Miss")
        continue

    if VX<0:
        MX=W-MX
        HX=W-HX
        VX=-VX
    if VY<0:
        MY=H-MY
        HY=H-HY
        VY=-VY
    L=[[MX,MY],[MX,2*H-MY],[2*W-MX,MY],[2*W-MX,2*H-MY]]
    flg=False
    for [x,y] in L:
        GX=gcd(VX,2*W)
        GY=gcd(VY,2*H)
        if (x-HX)%GX!=0 or (y-HY)%GY!=0:
            continue
        NVX=VX//GX
        MSX=(x-HX)//GX
        NW=(2*W)//GX
        NVY=VY//GY
        MSY=(y-HY)//GY
        NH=(2*H)//GY
        INV_NVX=inv_mod(NVX,NW)
        INV_NVY=inv_mod(NVY,NH)
        MSX*=INV_NVX
        MSY*=INV_NVY
        MSX%=NW
        MSY%=NH
        V1=[MSX,MSY]
        V2=[NW,NH]
        [r,m]=crt(V1,V2)
        if m!=0 and r<=D:
            flg=True
    if flg:
        print("Hit")
    else:
        print("Miss")
0