結果
問題 |
No.1935 Water Simulation
|
ユーザー |
![]() |
提出日時 | 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)