CF1404D Game of Pairs


題目來源:Codeforces Round #668 (Div. 1) CF1404 D題

算法:構造

題目大意

題目鏈接

交互題。

給定一個正整數\(n\)。兩人玩一個游戲。游戲分為兩個步驟:

  1. 先手把\(1,2,\dots ,2n\)這個\(2n\)個數,兩兩配對。
  2. 后手在每一對中,選擇恰好一個數。

如果所選出的數之和是\(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)\)

代碼略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM