Vijos P1196吃糖果游戏[组合游戏]

描述

Matrix67和Shadow正在做一个小游戏。

桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。

这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。

Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。

格式

输入格式

输入数据一共10行,每行有两个用空格隔开的正整数,表示一次游戏开始时桌子上两堆糖果分别有多少个。

对于50%的数据,这些正整数均不超过100;
对于70%的数据,这些正整数均不超过10 000;
对于100%的数据,这些正整数均不超过10 000位。

输出格式

输出十行字符串。这些字符串只能是“Matrix67”或“Shadow”,它们表示对应的十行输入数据中有必胜策略的一方。

请注意大小写。

样例1

样例输入1[复制]

 
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5

样例输出1[复制]

 
Matrix67
Matrix67
Matrix67
Matrix67
Matrix67
Matrix67
Shadow
Shadow
Matrix67
Matrix67

限制

各个测试点1s

来源

Matrix67原创


规定了获胜状态

从(x,1)开始递推

设(x,a),吃掉x,留下的a分开,如果能分成两部分c和d使(x,c)和(x,d)都是P状态,(x,a)就是n状态;如果不得不存在一个N状态的,(x,a)就是P状态

递推完1...10后>10的%10就行了

还有一种分析:(%Matrix67)

当游戏状态属于前者时,Matrix67可以把糖果数被5除余1、4或正好除尽的那一堆分成糖果数被5除余数都是2或3的两堆(他总能做到这一点),而对方不得不把其中一堆糖果又分出新的糖果数被5除余1、4或正好除尽的一堆留给Matrix67操作。这样逼着对方总是面临必败的状态,使得最后对方不得不把2个糖果或者3个糖果分成两堆,从而使Matrix67赢得游戏。反过来,当Matrix67面临两堆糖果的数目被5除余数都是2或3的状态时,Shadow总可以取胜。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e4+5,INF=1e9+5;
char a[N],b[N];
int main(){
    for(int i=1;i<=10;i++){
        scanf("%s%s",a,b);
        int n=strlen(a)-1,m=strlen(b)-1;
        char c=a[n],d=b[m];
        if((c=='2'||c=='3'||c=='7'||c=='8')&&(d=='2'||d=='3'||d=='7'||d=='8')) puts("Shadow");
        else puts("Matrix67");
    }
}
原文地址:https://www.cnblogs.com/candy99/p/6059510.html