Vijos 1655萌萌的糖果||博弈

来源:互联网 发布:淘宝助理5.5使用教程 编辑:程序博客网 时间:2024/04/28 22:14

https://vijos.org/p/1655

**

背景

**
用糖果来引诱小朋友学习是最常用的手法,绵羊爸爸就是用糖果来引诱萌萌学习博弈的。


**

描述

**
他把糖果分成了两堆,一堆有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");    }}


——既然选择了远方,便只顾风雨兼程

0 0
原创粉丝点击