1. 程式人生 > 實用技巧 >巴什博弈

巴什博弈

題目描述:

傑洛特在面對敵將時,總是需要獲得更多的資源才能戰勝敵人,很可惜,敵人也是這麼想的。
因此他們共同來到一個城市買物資(兩位都有無限的錢)
本城市中一共有n個物資,
他們倆輪流進行購買(由傑洛特先買)
每一次購買可以買 1……m 個物資
最先剛好購買光商品的人可以獲勝

輸入:

多組資料輸入
每行一個n和m。
0 < m <= n <= 100000

輸出:

如果是傑洛特勝利則輸出"Gerlot",如果是狂獵勝利則輸出"Wildhunte" (沒有雙引號)

樣例輸入:

23 2
4 3

樣例輸出:

Gerlot
Wildhunte

巴什博弈:

兩個頂尖聰明的人在玩遊戲,有一堆nn個石子,每次每個人能取[1,m][1,m]個石子,不能拿的人輸,請問先手與後手誰必敗?

我們分類討論一下這個問題:

當n≤mn≤m時,這時先手的人可以一次取走所有的;

當n=m+1n=m+1時,這時先手無論取走多少個,後手的人都能取走剩下所有的;

當n=k∗(m+1)n=k∗(m+1)時,對於每m+1m+1個石子,先手取ii個,後手一定能將剩下的(m+1−i)(m+1−i)個都取走,因此後手必勝;

當n=k∗(m+1)+x(0<x<m+1)n=k∗(m+1)+x(0<x<m+1)時,先手可以先取xx個,之後的局勢就回到了上一種情況,無論後手取多少個,先手都能取走m+1m+1箇中剩下的,因此先手必勝。

結論:

通過上面的分析可以得出結論:當nn能整除m+1m+1時先手必敗,否則先手必勝。


#include<stdio.h>
int main() {
    int n, m;
    while(scanf("%d%d",&n,&m)!=EOF)
        if(n % (m + 1))
            printf("Gerlot\n");
        else
            printf("Wildhunte\n");
    return 0;
}