題目來源:Codeforces Round #668 (Div. 1) CF1404 D題
算法:構造
題目大意
交互題。
給定一個正整數\(n\)。兩人玩一個游戲。游戲分為兩個步驟:
- 先手把\(1,2,\dots ,2n\)這個\(2n\)個數,兩兩配對。
- 后手在每一對中,選擇恰好一個數。
如果所選出的數之和是\(2n\)的倍數,則后手勝,否則先手勝。
給定\(n\)。請你自己選擇做先手或后手,並給出必勝策略。
數據范圍:\(1\leq n\leq 5\times 10^5\)。
本題題解
part1:\(n\)是偶數時
引理1.1:\(n\)是偶數時,先手必勝。
證明1.1:
先手的配對策略是:\((1,n+1),(2,n+2),\dots ,(n,2n)\)。
此時,每一對里的數,\(\bmod n\)的值分別是\(1,2,\dots ,n-1,0\)。所以無論怎么選,所選出的數之和,\(\bmod n\)都等於\(1+2+\dots +n-1=\frac{n(n-1)}{2}\)。
設\(n=2m\),則\(\frac{n(n-1)}{2}=\frac{2m(2m-1)}{2}=m(2m-1)\)。
因為\(2m-1\)是個奇數,所以\(m(2m-1)\)一定不是\(n\)的倍數,因此也一定不是\(2n\)的倍數。
part2:\(n\)是奇數時
我們猜想,\(n\)是奇數時后手必勝。現在需要通過構造出后手的策略,來證明這個猜想。
引理2.1:\(n\)是奇數時,后手想要獲勝,只需要構造出一種方案,使得所選的數之和是\(n\)的倍數即可。
也就是說,這個引理,將后手獲勝的條件從“是\(2n\)的倍數”,弱化到了“是\(n\)的倍數”。那么其中必定有一種奇妙的構造方法,當知道了一個“和是\(n\)的倍數的方案”后,能立刻在此基礎上構造出“和是\(2n\)倍數的方案”。
證明2.1:
\(n\)是奇數時,所有數之和\(1+2+\dots +2n=n(2n+1)\)。
因為\(2n+1\)是個奇數,所以\(n(2n+1)\equiv n\pmod{2n}\)。也就是說,所有數之和,\(\bmod 2n\)的余數是\(n\)。
現在,假如我們知道了一種“和是\(n\)的倍數的選擇方案”。那這個和在\(\bmod 2n\)的意義下,要么余\(0\),要么余\(n\)。
- 如果余\(0\),則我們已經構造出了“和是\(2n\)倍數的方案”。
- 如果余\(n\),則未被選中的數之和,\(\bmod 2n\)一定余\(0\)。我們選所有當前未被選中的數,就能得到一個“和是\(2n\)倍數的方案”。
引理2.2:無論先手怎么分組,總存在一種方案,使得\(\bmod n=0,1,\dots,n-1\)的數各被選中一次。
此時所有選中的數之和,在\(\bmod n\)意義下就是\(1+2+\dots +n-1=\frac{n(n-1)}{2}\),一定是\(n\)的倍數。
證明2.2:
先隨便選一個\(\bmod n=0\)的數(也就是\(n\)或\(2n\))。假設與它配對的數\(\bmod n=x\)。再選另一個\(\bmod n=x\)的數。再把與新選的數配對的數拋棄掉,選一個與之同余的......。直到某一次被拋棄掉的數,就是另一個\(\bmod n=0\)的數,那么當前所選的數就形成了一個閉環。同理,剩下的數也一定是若干個閉環,每個環相互獨立,我們各個擊破即可。
更形式化地說,我們其實是建了一張無向圖。有\(n\)個節點,標號\(0,1,\dots ,n-1\)。如果\((x,y)\)配對,就在\(x\bmod n\)和\(y\bmod n\)之間連一條邊。因為每個點度數都是\(2\),所以整張圖一定是若干個環。
結合引理2.2和引理2.1,就在\(n\)為奇數時構造出了一種后手必勝的方案。
時間復雜度\(O(n)\)。
代碼略。