Vijos 1655萌萌的糖果||博弈

https://vijos.org/p/1655

border="0" width="235" height="346" src="http://www.xiami.com/widget/39278414_1770968200,1770968178,1769326698,1773614784,1773597382,1774370889,1769460372,1769460366,1774133995,1774441106,1771140574,1770936331,1771410193,1771169318,1771310570,_235_346_5695c1_457cb4_1/multiPlayer.swf">

**

背景

**
用糖果來引誘小朋友學習是最常用的手法,綿羊爸爸就是用糖果來引誘萌萌學習博弈的。


**

描述

**
他把糖果分成了兩堆,一堆有A粒,另一堆有B粒。他讓萌萌和他一起按照下面的規則取糖果:每次可以任意拿走其中一堆糖果;如果這時候另一堆糖果數目多於1粒,就把它任意分成兩堆,否則就把剩下的一粒糖果取走並獲得這次博弈的勝利。勝利者將獲得所有的糖果。萌萌想要得到所有的糖果,而綿羊爸爸想把糖果留下以便下一次利用。現在由萌萌先取糖果,旁觀的小朋友們想知道萌萌是否有必勝策略。
格式


**

輸入格式

**
本題有多組測試數據(不超過100組)。每組數據包括兩行,第一行爲A,第二行爲B。1 ≤ A,B ≤ 2^127。輸入數據以一個 -1 結束。


**

輸出格式

**
每組數據對應一行輸出。如果萌萌獲勝則輸出”MengMeng”,否則輸出”SheepDaddy”(不包括引號)。
樣例1
**

重點內容

**

**樣例輸入1

**
1
2
2
3
-1
**

樣例輸出1

**
MengMeng
SheepDaddy


**

Solution:

**
如果對五取模餘2或3爲必敗態,否則爲必勝態.

-Proof:

我們先證明 當有 起初態任意一個爲 1 4 5 先手必勝

先手:x,1——取x——>勝
先手:x,4——取x——>後手:2,2(只能取2…)——>先手:1,1——>勝
先手:x,5——取x——>後手:2,3(剩下2的上面討論了..於是取2剩下3)
——>先手:1,2——>勝

對於任意一個數 x ≡ 2 or 3 (mod 5) 我們將他拆成兩個數 a b 那麼我們可以斷定 a 和 b其中一定有一個 mod 5 ≠ 2 or 3

然而對於任意一個 x ≡ 0 or 1 or 4 我們都可以拆成兩個數 且都滿足 mod 5餘 2 or 3 然後這樣就必勝態一直可以是自己保持着必勝態 然後數會一直減小 所以最後回到了我們最早的證明

end-


**

Code

**

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
 char s1[10003],s2[10003];
 int main()
{
    while(1)
    {
        scanf("%s",s1);
        if(s1[0]=='-')return 0;
        scanf("%s",s2);
        int a=s1[strlen(s1)-1]-'0',b=s2[strlen(s2)-1]-'0';
        a%=5;b%=5;
        if((a==2||a==3)&&(b==2||b==3))
            printf("SheepDaddy\n");
        else 
            printf("MengMeng\n");
    }
}


——既然選擇了遠方,便只顧風雨兼程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章