1. 程式人生 > 實用技巧 >除數博弈

除數博弈

除數博弈

愛麗絲和鮑勃一起玩遊戲,他們輪流行動,愛麗絲先手開局。
最初,黑板上有一個數字N,在每個玩家的回合,玩家需要執行以下操作:

  • 選出任一x,滿足0 < x < NN % x == 0
  • N - x替換黑板上的數字N

如果玩家無法執行這些操作,就會輸掉遊戲。
只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false,假設兩個玩家都以最佳狀態參與遊戲。

示例

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。
輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。

題解

/**
 * @param {number} N
 * @return {boolean}
 */
var divisorGame = function(n) {
    return n & 1 ? false : true;
};

思路

理解一下題意,查看了輸入輸出示例,推斷這是一個通過判斷奇偶性決定勝負的遊戲。
這裡引用官方推論:博弈類的問題常常讓我們摸不著頭腦。當我們沒有解題思路的時候,不妨試著寫幾項試試:

  • N = 1的時候,區間(0, 1)中沒有整數是 n的因數,所以此時Alice敗。
  • N = 2的時候,Alice只能拿1N變成1Bob無法繼續操作,故Alice勝。
  • N = 3的時候,Alice只能拿1N變成2,根據N = 2的結論,我們知道此時Bob 會獲勝,Alice敗。
  • N = 4的時候,Alice能拿12,如果Alice1,根據N = 3的結論,Bob會失敗,Alice會獲勝。
  • N = 5的時候,Alice
    只能拿11,根據N = 4的結論,Alice會失敗。
  • ......

寫到這裡,也許你有了一些猜想。沒關係,請大膽地猜想,在這種情況下大膽地猜想是AC的第一步。也許你會發現這樣一個現象:N為奇數的時候Alice(先手)必敗,N為偶數的時候 Alice必勝。 這個猜想是否正確呢?下面我們來想辦法證明它。
證明:N = 1N = 2時結論成立。
N > 2時,假設N ≤ k時該結論成立,則N = k + 1時,如果k為偶數,則k + 1為奇數,xk + 1的因數,只可能是奇數,而奇數減去奇數等於偶數,且k+1−x≤k,故輪到Bob的時候都是偶數。而根據我們的猜想假設N≤k的時候偶數的時候先手必勝,故此時無論Alice

拿走什麼,Bob都會處於必勝態,所以Alice處於必敗態。如果kk為奇數,則k + 1為偶數,x可以是奇數也可以是偶數,若Alice減去一個奇數,那麼k+1−x是一個小於等於k的奇數,此時Bob佔有它,處於必敗態,則Alice處於必勝態。綜上所述,這個猜想是正確的。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/divisor-game