結果
| 問題 |
No.3068 Speedrun (Hard)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-01 11:20:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 123 ms / 2,000 ms |
| コード長 | 2,277 bytes |
| コンパイル時間 | 633 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 75,512 KB |
| 最終ジャッジ日時 | 2025-06-01 11:20:45 |
| 合計ジャッジ時間 | 3,811 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 32 |
ソースコード
A,B,C,D,N = map(int,input().split())
P,Q,R,S,T = map(int,input().split())
def ext_gcd(a,b):
if b==0:
return a,1,0
d,x,y = ext_gcd(b,a%b)
return d,y,x-(a//b)*y
def solve(a,b,c,A1,B1):
if c<0:
a = -a
b = -b
c = -c
d,x,y = ext_gcd(a,b)
if c%d!=0:
return -1
a //= d
b //= d
c //= d
d,x,y = ext_gcd(a,b)
x *= c
y *= c
if a>0 and b>0:
low = max((-x+b-1)//b,(y-B1+a-1)//a)
high = min((A1-x)//b,y//a)
elif a>0 and b<0:
low = max((A1-x+b-1)//b,(y-B1+a-1)//a)
high = min(x1//(-b),y1//a)
elif a<0 and b>0:
low = max((-x+b-1)//b,(y+a-1)//a)
high = min((A1-x)//b,(y-B1)//a)
if low>high:
return -1
return (x,y,a,b,low,high)
ans = -1
if S==P and S==Q and S==R:
x = min(A,N)
y = min(B,N-x)
z = min(C,N-x-y)
w = N-x-y-z
ans = (x,y,z,w)
elif S==P and S==Q and S!=R:
z = (S*N-T)//(S-R)
x = min(A,N-z)
y = min(B,N-z-x)
w = N-x-y-z
ans = (x,y,z,w)
elif S==R and S!=P and S==Q:
x = (S*N-T)//(S-P)
y = min(A,N-x)
z = min(C,N-x-y)
w = N-x-y-z
ans = (x,y,z,w)
elif S!=R and S!=P and S==Q:
a = S-P
b = S-R
c = S*N-T
x1,z1,a1,b1,low,high = solve(a,b,c,A,C)
for k in range(low,high+1):
x = x1+k*b1
z = z1-k*a1
y = min(B,N-x-z)
w = N-x-y-z
if 0<=w<=D:
ans = (x,y,z,w)
break
elif S==R and S!=Q and S==P:
y = (S*N-T)//(S-Q)
x = min(A,N-y)
z = min(C,N-x-y)
w = N-x-y-z
ans = (x,y,z,w)
elif S!=R and S!=Q and S==P:
a = S-Q
b = S-R
c = S*N-T
y1,z1,a1,b1,low,high = solve(a,b,c,B,C)
for k in range(low,high+1):
y = y1+k*b1
z = z1-k*a1
x = min(A,N-y-z)
w = N-x-y-z
if 0<=w<=D:
ans = (x,y,z,w)
break
else:
for z in range(C+1):
a = S-P
b = S-Q
c = S*N-T-(S-R)*z
if solve(a,b,c,A,B)==-1:continue
x1,y1,a1,b1,low,high = solve(a,b,c,A,B)
for k in range(low,high+1):
x = x1+k*b1
y = y1-k*a1
w = N-x-y-z
if 0<=w<=D:
ans = (x,y,z,w)
break
if ans != -1:break
print(*ans)