聖誕節到了!當大多數工作場所都在進行秘密聖誕老人(Secret Santa)禮物交換時,你的工作場所正在策劃一個更邪惡的陰謀:揭開聖誕老人的秘密。
聖誕老人為地球上的每個人都準備了一份「淘氣或乖巧」名單。由於其內容非常敏感,該名單是用北極波蘭語(North-Polish)編寫的,這是一種擁有 $N$ 個字母的神秘語言。為了進一步保密,聖誕老人用一種代換密碼(substitution cipher)對這份名單進行了加密:這是一個數字 $1, 2, \dots, N$ 的排列 $H$,它將每個北極波蘭語字母 $i$ 對應到一個不同的字母 $H(i)$。在這樣的密碼中,沒有兩個字母會對應到同一個目標字母——形式上來說,若 $i \neq j$,則 $H(i) \neq H(j)$——否則聖誕老人將無法解讀他的名單!(聖誕老人可以選擇將某些字母對應到它們自身,即 $H(i) = i$,只是為了更狡猾一點。)
幸運的是,聖誕老人的伺服器編碼品質很差,且暴露在公共網際網路上。你和你的同事希望駭入聖誕老人的伺服器,解讀他的名單,並確認你們都是淘氣的!(駭客總是淘氣的。)
該伺服器的設計目的是讓聖誕老人可以隨時隨地快速檢查他的名單。在使用者連接到伺服器後,它會提示使用者輸入編碼排列 $H$ 的 $N$ 個整數 $H(1), H(2), \dots, H(N)$,驗證該列表是否正確,然後解讀聖誕老人的秘密名單。經過數月的研究,你發現了一個側通道計時漏洞。假設你輸入一個排列 $Q$。如果 $H = Q$,伺服器會立即授予存取權限。否則,考慮一個具有 $N$ 個頂點的圖,並從每個頂點 $i$ 到頂點 $H(Q(i))$ 添加一條邊。你發現伺服器的複雜驗證演算法回應「存取被拒」(Access Denied)錯誤訊息所需的時間(以秒為單位),恰好等於所得圖中的連通分量數量。
例如,假設 $N = 4$ 且密碼排列 $H$ 如下:
| $i$ | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| $H(i)$ | 2 | 3 | 1 | 4 |
如果你嘗試以輸入 $4\ 3\ 2\ 1$ 登入伺服器,由於此排列與 $H$ 不符,且上述圖表具有兩個連通分量(一個包含邊 $1 \to 4 \to 2 \to 1$ 的循環,另一個僅包含自環 $3 \to 3$),伺服器將在延遲 2 秒後回應「存取被拒」錯誤訊息。
注意,如果你嘗試使用不同的輸入 $Q$ 多次登入伺服器,它每次都會針對同一個儲存的 $H$ 進行驗證。它不會因為你的輸入而以任何方式改變 $H$。
如果伺服器受到未經授權的請求轟炸,聖誕老人會注意到。你估計你最多只能進行 $1\,510$ 次登入嘗試,否則會引起過多懷疑。你能找到一種有效的策略來確定密碼排列嗎?
互動
這是一個互動式問題。互動開始時,從標準輸入讀取一個整數 $N$ ($1 \le N \le 220$),代表北極波蘭語中的字母數量。評測系統是非適應性的:隱藏的排列 $H$ 在此時選定,並且在互動的其餘部分中不會改變。
若要嘗試登入伺服器,請列印一行包含 $N$ 個以空格分隔的整數 $Q(1), \dots, Q(N)$,其中 $Q$ 是 $\{1, 2, \dots, N\}$ 的一個排列。然後從標準輸入讀取一個整數,即伺服器回應你的輸入所需的秒數。
如果此延遲為 $0$,則表示你已成功找到密碼排列 $H$,你的程式應終止。如果不是,此延遲即為根據上述程序所建構圖中的連通分量數量。
你最多可以嘗試登入 $1\,510$ 次。如果你用盡了嘗試次數,你的程式應乾淨地退出(儘管它會因為未能解讀聖誕老人的「淘氣或乖巧」名單而被判定為錯誤)。
說明
請務必在每次列印一行後重新整理輸出串流(flush the output stream),並在互動完成後乾淨地退出。請確保你嚴格遵守上述互動協定,關於在輸出的哪一行列印什麼資訊:例如,如果協定要求你在單行上列印一串以空格分隔的整數,評測系統將不接受每個整數佔用一行。
如果評測系統收到無效或意外的輸入,它將列印 $-1$ 然後立即退出。你的程式必須偵測到這一點並乾淨地退出,以獲得「答案錯誤」(Wrong Answer)的判定。如果你的程式在等待評測系統的進一步互動時阻塞,或者試圖將 $-1$ 解釋為連通分量的數量,你可能會收到不同的拒絕判定(例如「執行時間超時」(Time Limit Exceeded)或「執行階段錯誤」(Runtime Error))而不是「答案錯誤」。
你已獲得一個用於本地測試的命令列工具。該工具在頂部有註解說明其用法。
範例
範例 1
3
1 2 3
1
2 1 3
2
3 1 2
0