結果
| 問題 |
No.3120 Lower Nim
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-02 09:57:34 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,678 bytes |
| コンパイル時間 | 445 ms |
| コンパイル使用メモリ | 82,300 KB |
| 実行使用メモリ | 94,112 KB |
| 平均クエリ数 | 1360.27 |
| 最終ジャッジ日時 | 2025-06-02 09:57:47 |
| 合計ジャッジ時間 | 11,440 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 23 WA * 20 |
ソースコード
import sys
def solve():
"""
インタラクティブなゲーム問題を解くためのメイン関数です。
"""
# 標準入力の高速化
input = sys.stdin.readline
# Nの読み込み
try:
n_str = input()
if not n_str: return
n = int(n_str)
# Aの読み込み
a = list(map(int, input().split()))
except (IOError, ValueError):
return
# ニム和を計算する関数
def calculate_nim_sum(arr):
nim_sum = 0
for x in arr:
nim_sum ^= x
return nim_sum
# 初期のニム和を計算
initial_nim_sum = calculate_nim_sum(a)
# 先攻・後攻の決定
if initial_nim_sum == 0:
player = "Second"
print("Second", flush=True)
else:
player = "First"
print("First", flush=True)
# ゲームループ
turn = "First"
while True:
if turn == player:
# 自分のターン
current_nim_sum = calculate_nim_sum(a)
# 最適な手を見つける
move_i, move_x = -1, -1
for i in range(n):
if (a[i] ^ current_nim_sum) < a[i]:
move_x = a[i] - (a[i] ^ current_nim_sum)
move_i = i
break
# 手を出力
print(f"{move_i + 1} {move_x}", flush=True)
a[move_i] -= move_x
# ジャッジからの応答を読み込む
try:
ret_str = input()
if not ret_str: return
ret = int(ret_str)
except (IOError, ValueError):
return
if ret != 0:
# ゲーム終了
return
else:
# 相手のターン
try:
line = input()
if not line: return
i, x = map(int, line.split())
except (IOError, ValueError):
return
# 相手の手を盤面に反映
if i != -1: # 初期状態でないことを確認
a[i - 1] -= x
# ジャッジからの応答を読み込む
try:
ret_str = input()
if not ret_str: return
ret = int(ret_str)
except (IOError, ValueError):
return
if ret != 0:
# ゲーム終了
return
# ターンを交代
turn = "Second" if turn == "First" else "First"
if __name__ == "__main__":
solve()