結果

問題 No.62 リベリオン(Extra)
ユーザー yaoshimaxyaoshimax
提出日時 2015-02-25 00:57:02
言語 Python2
(2.7.18)
結果
AC  
実行時間 623 ms / 5,000 ms
コード長 2,967 bytes
コンパイル時間 64 ms
コンパイル使用メモリ 6,648 KB
実行使用メモリ 6,324 KB
最終ジャッジ日時 2023-09-06 04:17:52
合計ジャッジ時間 1,542 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 11 ms
5,936 KB
testcase_01 AC 11 ms
5,964 KB
testcase_02 AC 149 ms
6,208 KB
testcase_03 AC 152 ms
6,324 KB
testcase_04 AC 623 ms
6,272 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def gcd(a,b):
    if b<a:
        return gcd(b,a)
    if b%a==0:
        return a
    return gcd(b%a,a)

def ext_gcd(a,b):
    # return (n,m) s.t. na+mb=1
    if b<a:
        (N,M)=ext_gcd(b,a)
        return (M,N)
    if a==1:
        return (1,0)
    r=b%a
    t=b/a
    # at+r=b, so na+mb=1=na+(at+r)m=(n+tm)a+mr
    (N,M)=ext_gcd(r,a)
    # N=m, M=n+tm so n=M-tN, m=N
    return (M-N*t,N)


Q=int(raw_input())
for i in range(Q):
    W,H,D,Mx,My,Hx,Hy,Vx,Vy=map(int,raw_input().split())
    Vg=max(abs(Vx),abs(Vy))
    if Vx == 0:
        if Mx==Hx and ((My-Hy)<=D*Vy or (My<Hy and My+Hy<=D*abs(Vy)) or (My>Hy and 2*H-My-Hy <= D*abs(Vy)) ):
            print "Hit"
        else:
            print "Miss"
        continue
    if Vy == 0:
        if My==Hy and ((Mx-Hx)<=D*Vx or (Mx<Hx and Mx+Hx<=D*abs(Vx)) or (Mx>Hx and 2*W-Mx-Hx <= D*abs(Vx)) ):
            print "Hit"
        else:
            print "Miss"
        continue
    Vg=gcd(abs(Vx),abs(Vy))
    Vx/=Vg
    Vy/=Vg
    D*=Vg
    if Vx < 0:
        Vx=-Vx
        Mx=W-Mx
        Hx=W-Hx
    if Vy < 0:
        Vy=-Vy
        My=H-My
        Hy=H-Hy
    ## find k s.t. Hx+kVx= 2nW+Mx and Hy+kVy = 2mH+My
    ##             (Hx-Mx)Vy-(Hy-My)Vx = n(2WVy)-m(2HVx)
    ## find k s.t. Hx+kVx= 2mW-Mx and Hy+kVy = 2nH-My...
    #conlist=[(Hx-Mx)*Vy-(Hy-My)*Vx, (Hx+Mx)*Vy-(Hy-My)*Vx, (Hx-Mx)*Vy-(Hy+My)*Vx,(Hx+Mx)*Vy-(Hy+My)*Vx]
    
    conList=[(Hx,Mx,Hy,My),(Hx,-Mx,Hy,My),(Hx,Mx,Hy,-My),(Hx,-Mx,Hy,-My)]
    isHit = False
    for (hx,mx,hy,my) in conList:
        #print hx,mx,hy,my,Vx,Vy
        con=(hx-mx)*Vy-(hy-my)*Vx
        #print con
        g=gcd(abs(2*W*Vy),abs(2*H*Vx))
        n,m=ext_gcd(abs(2*W*Vy/g),abs(2*H*Vx/g))
        ## 1 = n*2WVy/g+m*2HVx/g
        #print 1,"=",n,"*|2*",W,"*",Vy,"/",g,"|", "+", m,"*|2*",H,"*",Vx,"/",g,"|"
        if con%g != 0:
            continue
        n*=con/g
        m*=con/g
        ## con=(Hx-Mx)Vy-(Hy-My)Vx = n*2WVy+m*2HVx = n*(2WVy/g)*g + m*(2HVx/g)*g
        ## not only (n,m) but also (n+t(2HVx/g), m-t(2WVy/g)) is possible
        ## k = (2nW+Mx-Hx)/Vx <=D is requird. k>0 of course
        ## let's find out t argmin_t( 2(n+t(2HVx/g))W+Mx-Hx >0 )
        ## n+t(2HVx/g) > (-Mx+Hx)/2W
        ## t(2HVx/g)>(Hx-Mx)/2W - n
        #print con,"=",n,"*2",W,"*",Vy,"+",m,"*2",H,"*",Vx
        #t=int(math.ceil(((hx-mx)/(2.0*W)-n)/(2*H*Vx/g))) #this might cause error
        t= ((hx-mx)-n*2*W+(2*W*2*H*Vx/g)-1)/(2*W*2*H*Vx/g)
        n+=t*(2*H*Vx/g)
        m-=t*(2*W*Vy/g)
        #print con,"=",n,"*2",W,"*",Vy,"+",m,"*2",H,"*",Vx
        #print 2,"*",n,"*",H,"+",my,"-",hy,"=",2*n*H+my-hy,"...",  2*H*Vx/g, "vs" , Vy,"*",D
        if (2*n*W+mx-hx) <= Vx*D:
            isHit=True
            #print con,"=",n,"*2",W,"*",Vy,"+",m,"*2",H,"*",Vx
            #print Hx,"+",(2*n*W+mx-hx)/Vx,"*",Vx, "=2*",n,"*",W,"+",mx
            #print (2*n*W+mx-hx)/Vx,"<=", Vx ,"*",D
            break
    if isHit:
        print "Hit"
    else:
        print "Miss"

0