本題為互動題。請記得在每次輸出後刷新輸出緩衝區。你可以使用以下方式刷新輸出:
- 在 C/C++ 中使用
fflush(stdout)或cout.flush(); - 在 Java 與 Kotlin 中使用
System.out.flush(); - 在 Python 中使用
sys.stdout.flush()。

由 Nano Banana Pro 繪製的遊戲概念圖。
你正在參加一場名為左輪輪盤賭(Revolver Roulette)的策略回合制遊戲。
遊戲開始時,左輪手槍中裝填了恰好 $6$ 發子彈。每發子彈獨立地以相等機率為實彈(live)或空包彈(blank)。雙方玩家始終知道彈巢中目前剩餘的實彈與空包彈數量,但不知道它們的確切排列順序。
每位玩家初始擁有 $5$ 點生命值(HP)與 $2$ 件道具。若一名玩家的 HP 降至 $0$ 或以下,該玩家即被淘汰,並由另一名玩家獲勝。雙方玩家輪流執行行動。
回合流程
在自己的回合中,當前行動玩家可以執行任意次數的以下行動:
- 使用任意道具。
- 執行任意射擊行動。
唯有當一次射擊行動導致回合移交給對方玩家,或是有玩家被淘汰時,當前回合才會結束。
射擊行動
當前行動玩家必須從以下射擊行動中選擇一種:
Fire at Opponent(向對手開槍):當前玩家向對方玩家射出下一發子彈。若是實彈,對方玩家失去 $1$ 點 HP。無論子彈類型為何,回合都會移交給對方玩家。Fire at Self(向自己開槍):當前玩家向自己射出下一發子彈。若是實彈,當前玩家失去 $1$ 點 HP,且回合移交給對方玩家。否則,若是空包彈,當前玩家保留回合並繼續執行行動。
道具
當一件道具被使用時,該道具會被消耗,且無論道具類型為何,當前行動玩家皆保留回合。所有道具對雙方玩家皆可見。當玩家獲得一件新道具(包含初始的每件道具)時,該道具會從以下四種類型中均勻隨機選出:
Dummy(假人):向訓練假人射出下一發子彈。這會消耗該發子彈,且不視為一次射擊行動。Magnifier(放大鏡):偷看下一發子彈,揭示下一發子彈是實彈還是空包彈。雙方玩家皆會得知該結果。Converter(轉換器):翻轉下一發子彈的類型(實彈 $\leftrightarrow$ 空包彈)。雙方玩家皆會觀察到更新後的實彈與空包彈數量。Cage(牢籠):獲得一個一次性效果,阻止下一次原本會結束回合的射擊行動結束回合。具體而言:- 若玩家隨後執行
Fire at Opponent(無論子彈是實彈或空包彈),該效果生效且回合不會結束。 - 若玩家隨後執行
Fire at Self且子彈為實彈,該效果生效且回合不會結束(玩家仍會失去 $1$ 點 HP,但保留回合)。
該效果在生效一次後立即消耗。每個回合至多只能使用一件
Cage道具。- 若玩家隨後執行
重新裝填(Reloading)
當彈巢清空時,會立即裝填 $6$ 發新子彈(每發獨立地以相等機率為實彈或空包彈)。雙方玩家皆會被告知新的實彈與空包彈數量。此外,每位玩家的道具會被補充至 $2$ 件(擁有 $k$ 件道具的玩家會獲得 $(2 - k)$ 件新道具,每件獨立地從上述四種類型中均勻隨機選出)。
目標
你是先手玩家,你的目標是透過淘汰對手來贏得遊戲。
輸入格式
第一行包含兩個整數 $n$ 與 $w$,代表你需要在 $n$ 局遊戲中至少贏下 $w$ 局才能通過測試。本題僅有三個測試點:
- 範例測試點:$n = 1$ 且 $w = 0$。($0\%$)
- 秘密測試點 1:$n = 2\,000$ 且 $w = 1\,000$。($50\%$)
- 秘密測試點 2:$n = 20\,000$ 且 $w = 11\,000$。($55\%$)
可以證明,當雙方玩家皆採取最佳策略時,先手玩家約可贏得 $56.89\%$ 的遊戲。
互動協議
遊戲開始
你的程式作為先手玩家與互動器對局。在每局遊戲開始時,互動器會輸出一個整數 $g$:
- 若 $g = 0$,代表當前執行階段中的所有遊戲皆已完成。你的程式必須立即終止。
- 否則,$g$ 為當前遊戲的編號($1 \le g \le n$)。
由於技術因素,你的程式在每個測試點上會被執行兩次:
- 互動器可以隨時透過給出 $g = 0$ 來決定重啟你的程式。
在同一個測試點的每次執行中,你都會收到相同的 $n$ 與 $w$。因此,$n$ 不一定等於當前執行中的遊戲局數。保證第 $1, \dots, n$ 局遊戲在兩次執行中合計恰好各進行一次。除此之外,你的程式可以安全地忽略執行兩次這項條件。
遊戲狀態
接著,互動器會輸出一行包含 $13$ 個非負整數的遊戲狀態:
$$t \quad l \quad b \quad h_1 \quad d_1 \quad m_1 \quad c_1 \quad k_1 \quad h_2 \quad d_2 \quad m_2 \quad c_2 \quad k_2$$
- $t \in \{0, 1, 2\}$:回合狀態。
- $l, b$($1 \le l + b \le 6$):彈巢中目前剩餘的實彈與空包彈數量。
- $h_1$($0 \le h_1 \le 5$):你目前的 HP。
- $d_1, m_1, c_1, k_1$($0 \le d_1 + m_1 + c_1 + k_1 \le 2$):你目前持有的
Dummy、Magnifier、Converter與Cage道具數量。 - $h_2$($0 \le h_2 \le 5$):對手目前的 HP。
- $d_2, m_2, c_2, k_2$($0 \le d_2 + m_2 + c_2 + k_2 \le 2$):對手持有的
Dummy、Magnifier、Converter與Cage道具數量。
情況 $t = 0$(遊戲結束)
當前遊戲已結束。互動器進入下一局遊戲(輸出新的 $g$)。
情況 $t = 1$(你的回合)
你必須輸出一個整數以選擇行動:
Fire at Opponent。Fire at Self。- 使用一件
Dummy道具。 - 使用一件
Magnifier道具。 - 使用一件
Converter道具。 - 使用一件
Cage道具。
若行動無效(例如使用你沒有的道具,或在同一回合內多次使用 Cage 道具),遊戲狀態保持不變,互動器會輸出 $0$ 並再次輸出相同的狀態行($13$ 個整數)。雖然仍是你的回合,但你必須做出另一個有效行動以繼續遊戲。
否則,行動生效,互動器會輸出一個結果整數:
- 對於行動 $1$–$5$:若行動前的下一發子彈為實彈則回傳 $1$,若為空包彈則回傳 $2$。
- 對於行動 $6$:回傳 $1$(不揭露任何子彈資訊)。
隨後互動器會輸出更新後的遊戲狀態行。
情況 $t = 2$(對手的回合)
互動器會模擬對手的行動並輸出兩行:
- 行動編號 $a \in \{1, \dots, 6\}$。
- 結果整數(如上所述的 $1$ 或 $2$)。
對手絕不會執行非法行動。緊接著,互動器會輸出下一行遊戲狀態($13$ 個整數)。
在每局遊戲的每一輪中,遊戲模擬器皆使用固定隨機種子的偽隨機數產生器。同時,互動器中的對手採用確定性策略。重啟程式的決定獨立於互動過程。因此,相同的行動序列總是會導致相同的遊戲狀態。
題目提供測試工具,以協助你開發與測試你的程式。
範例
範例 1,第 1 次執行
輸入
1 0 1 1 3 3 5 0 0 0 2 5 1 0 1 0 1 1 3 3 5 0 0 0 1 5 1 0 1 0 1 1 2 3 5 0 0 0 1 4 1 0 1 0 0 1 2 3 5 0 0 0 1 4 1 0 1 0 2 1 2 2 5 0 0 0 1 4 1 0 1 0 1 2 1 2 5 0 0 0 1 3 1 0 1 0 5 2 2 2 1 5 0 0 0 1 3 1 0 0 0 1 1 1 1 1 4 0 0 0 1 3 1 0 0 0 1 2 0 1 4 0 0 0 1 2 1 0 0 0 3 2 2 2 4 4 0 1 0 1 2 0 1 0 1 2 1 1 1 4 4 0 1 0 1 1 0 1 0 1 1 1 1 4 4 0 0 0 1 1 0 1 0 1 1 0 0 4 4 0 0 0 1 0 0 1 0 1 0
輸出
6 1 6 2 1 1 4 1
範例 1,第 2 次執行
輸入
1 0 0