首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HDU 3595 GG and MM(Every-SG)

HDU 3595 GG and MM(Every-SG)

作者头像
attack
发布2018-04-10 17:43:48
发布2018-04-10 17:43:48
1.5K0
举报

Problem Description

GG and MM like playing a game since they are children. At the beginning of game, there are two piles of stones. MM chooses a pile of stones first, which has x stones, and then she can choose a positive number k and remove k*x stones out from the other pile of stones, which has y stones (I think all of you know that y>=k*x - -!). Then it comes the turn of GG, followed the rules above-mentioned as well. When someone can't remove any stone, then he/she loses the game, and this game is finished. Many years later, GG and MM find this game is too simple, so they decided to play N games at one time for fun. MM plays first, as the same, and the one on his/her turn must play every unfinished game. Rules to remove are as same as above, and if someone cannot remove any stone (i.e., loses the last ending game), then he/she loses. Of course we can assume GG and MM are clever enough, and GG will not lose intentionally, O(∩_∩)O~

Input

The input file contains multiply test cases (no more than 100). The first line of each test case is an integer N, N<=1000, which represents there are N games, then N lines following, each line has two numbers: p and q, standing for the number of the two piles of stones of each game, p, q<=1000(it seems that they are so leisure = =!), which represent the numbers of two piles of stones of every game. The input will end with EOF.

Output

For each test case, output the name of the winner.

Sample Input

3 1 1 1 1 1 1 1 3 2

Sample Output

MM GG

Author

alpc95

Source

2010 ACM-ICPC Multi-University Training Contest(16)——Host by NUDT

Recommend

zhengfeng   |   We have carefully selected several similar problems for you:  3600 3593 3599 3598 3594

题意:一共有n个游戏,每一个游戏有两堆石子,一次移动可以从大的那堆石子里拿小的那堆石子的整数倍的石子。

只要是可以操作的游戏都要进行操作,不能进行操作的人负。

比较神的博弈

模型是Every-SG肯定是没问题,框架按套路写就可以

有一个比较显然的结论

设两个数为(x,y),那么当\frac{y}{x}>1,此时先手必胜,因为先手可能通过控制倍数来控制接下来步数的奇偶性

代码语言:javascript
复制
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
const int MAXN=1001;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int a[MAXN],b[MAXN],SG[MAXN][MAXN],step[MAXN][MAXN];
int GetSG(int x,int y)
{
    if(x>y) std::swap(x,y);
    if(SG[x][y]!=-1) return SG[x][y];
    if(!x||!y) return SG[x][y]=step[x][y]=0;
    int willx=y%x,willy=x;
    int k=y/x;
    if(k==1)
    {
        SG[x][y]=GetSG(willx,willy)^1;
        step[x][y]=step[willx][willy]+1;
        return SG[x][y];
    }
    else
    {
        step[x][y]=GetSG(willx,willy)+step[willx][willy]+1;
        return SG[x][y]=1;//此时先手必胜 
    }
}
int main()
{
    #ifdef WIN32
    freopen("a.in","r",stdin);
    #else
    #endif
    memset(SG,-1,sizeof(SG));
    int N;
    while(scanf("%d",&N)!=EOF)
    {
        int ans=0;
        for(int i=1;i<=N;i++) 
        {
            int x=read(),y=read();
            if(x>y) std::swap(x,y);
            GetSG(x,y);
            ans=std::max(ans,step[x][y]);
        }
        puts(ans%2?"MM":"GG");
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档