題目連結:https://codeforces.com/contest/1942/problem/E
題目大意:輸入一個 \(l\) 和一個 \(n\) ,其中 \((1\leq l \leq 10^6, 2n <= l)\) ,表示有 \(l\) 個不同的空位(分別是 \([1, l]\) )和 \(2n\) 頭完全一樣的牛。Alice 和 Bob 分別有 \(n\) 頭牛,並且他們的牛是間隔排列的。每一次操作,玩家可以選擇任意頭自己的牛,然後選擇一個方向(左或者右),然後被選擇的牛統一移動到該方向上距離為1的一個空位上。注意牛不能超過邊界也不能穿過另一個人的牛。求有多少種排列牛的方式使得 Alice 必勝。
題目分析:一般來說,這一類組合博弈的遊戲先手都是有巨大優勢的,因為如果能找到一個必敗狀態,先手可以有機會透過一次操作把當前狀態轉化成必敗狀態然後交給後手。一般來說,必敗狀態必定滿足某一些特殊的恆等式,先手玩家破壞這個必敗狀態,而後手玩家必定能找到一個方法回到必敗狀態(一般來說是直接模仿對方操作,舉例來說對於NIM遊戲,先手必敗的狀態的異或和為0,先手從任意堆中取若干石子之後異或和從0變成非0,後手要構造一種方法讓異或和重新變成0,要做的是證明後手總能如此構造)。對於這道題來說,可以只關心對應的兩頭牛之間的距離,因為如果不對應的兩頭牛之間的距離影響答案的話,如果是先手必敗,並且先手任選了其中的一些牛往擴大對應的牛之間的距離的方向移動,那麼後手只需要重複該操作使得牛之間的距離恢復成原貌即可;如果是先手必勝,那麼先手不去移動兩頭牛之間的距離,只去做一些別的(容易證明只有對應牛之間的距離都為0才不能去做別的,這種情況由模仿策略可知先手必敗,與假設先手必勝矛盾),然後把當前狀態轉移給後手就可以維持必勝。
所以只考慮對應的牛之間的距離,並且只能減少。
問題變成了:有n堆可能為空的石子,先手可以選其中任意堆各取1顆石子,如果所以堆都是空的則先手敗。由於每個堆互相獨立並且先後手交替操作並且每次只能減少至多1,很容易往奇偶性去想。首先全部都是空的時候是先手必敗,然後如果有若干堆是1的其他都是0,那麼先手把他們拿走就必勝了,故如果有1的堆就是必勝態,維持必勝的策略是不是讓每一堆都變成偶數呢?簡單想了想如果當前所有的堆都是偶數,那麼進行操作之後至少有一堆是奇數,然後另一個人肯定可以操作回來讓所有的堆維持回偶數,直到變成全部為0的必敗態。所以全部為偶數容易知道是先手必敗態。那麼其他的一定是先手必勝態嗎?只需要證明其他的狀態(有至少一堆為奇數)進行一次操作就能回到必敗態即可,結果是顯然的。
所以問題就是對牛和空位進行排列,讓對應的牛之間的距離至少有一個為奇數。
至少有一個為奇數這個不好求,容易想到可以用總方案數減去全部為偶數的方案數。
總方案數顯然是隔板法,l個空位中選2n個放牛,然後從左到右依次分配給Alice和Bob,或者反過來先Bob後Alice,所以要乘以2。
距離全部為偶數的解法,先把問題抽象成x個球和y個盒子。一個顯然的思路是用二進位制分解,由於每個數的二進位制分解是完全固定且一一對應的,列舉某個二進位制位(至少表示2),那麼每個盒子要麼有這個二進位制位要麼沒有,完全對應。這個方法也可以處理諸如異或和為0(每一個二進位制位是互相獨立的所以只需要每次都選偶數個1,並且每個盒子至多擁有1個1即可),剩下列舉到表示1的二進位制位(第0位)的時候,不能放在盒子裡,只能放在盒子之間和最兩端的總共y+1個空位上,由於空位可以重複放球所以這時候要用隔板法。但可惜過不了這一道題,這道題l是1e6,如果是2e5的話應該是可以透過的。那有沒有辦法直接保障所有盒子的球都是偶數呢?其實就是把2個球打包成一組,然後用隔板法把他們放在不同的盒子裡,記得把沒用完的繼續放在盒子外面。