結果
| 問題 |
No.1935 Water Simulation
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2025-05-13 10:10:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 36 ms / 2,000 ms |
| コード長 | 1,405 bytes |
| コンパイル時間 | 346 ms |
| コンパイル使用メモリ | 82,836 KB |
| 実行使用メモリ | 60,828 KB |
| 最終ジャッジ日時 | 2025-05-13 10:10:58 |
| 合計ジャッジ時間 | 2,825 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
def floyds_cycle_finding(a0, f) -> tuple[int, int]:
"""
フロイドの循環検出法
a0 : 初期値
f : 次の値を求める関数
return: tuple[サイクルに入るまでの長さ, サイクルの長さ]
"""
x = y = a0
while 1:
x = f(x)
y = f(f(y))
if x == y:
break
x = a0
head_len = 0
while x != y:
x = f(x)
y = f(y)
head_len += 1
cycle_len = 0
while 1:
x = f(x)
y = f(f(y))
cycle_len += 1
if x == y:
break
return head_len, cycle_len
def simulate(k: int):
x = (0, V1, 0, 0, 0)
for _ in range(k):
x = f(x)
return x
def move(a, va, b, vb):
x = min(a, vb - b)
return a-x, b+x
def f(vs):
p, v1, v2, v3, v4 = vs
match p:
case 0:
v1, v2 = move(v1, V1, v2, V2)
case 1:
v2, v3 = move(v2, V2, v3, V3)
case 2:
v3, v4 = move(v3, V3, v4, V4)
case 3:
v4, v1 = move(v4, V4, v1, V1)
return (p+1)%4, v1, v2, v3, v4
V1, V2, V3, V4, N = map(int, input().split())
s = (0, V1, 0, 0, 0)
head_len, cycle_len = floyds_cycle_finding(s, f)
if N <= head_len:
_, v1, v2, v3, v4 = simulate(N)
print(v1, v2, v3, v4)
exit()
m = (N - head_len) % cycle_len
_, v1, v2, v3, v4 = simulate(head_len + m)
print(v1, v2, v3, v4)
norioc