【题解】桐桐的游戏

题目描述

        桐桐正在和同桌吉吉玩一种数字游戏。游戏规则是这样的:给定两个正整数M和N,从桐桐开始,取其中较大的一个数,减去较小的数的正整数倍,当然,得到的数K不能小于0。然后是吉吉对刚才得到的数K和M、N中较小的那个数,再进行同样的操作......直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程。

        初始:25 7

        桐桐:11 7(18 7,11 7,4 7均可能)

        吉吉:4 7

        桐桐:4 3

        吉吉:1 3

        桐桐:1 0

        桐桐取得了游戏的胜利。现在,假设他们都能够“完美”地操作,谁会取得胜利呢?

 

输入输出格式

输入格式

        第一行为一个整数C(1≤C≤1000),表示有C组测试数据;下面有C行,每行有两个正整数M和N,大小均不超过长整型。

 

输出格式

        共有C行,每行输出对当前组数据的游戏结果。如果桐桐胜利,则输出“Tongtong wins”;否则输出“Jiji wins”。

输入输出样例

输入样例

2

25 7

24 15

 

输出样例

Tongtong wins

Jiji wins

 

题解

        根据博弈论可得,当一名玩家可以得到多个k时,他就必胜,因为他这次可以操纵使他下次继续可以得到多个k,这样他就可以直接操纵游戏发展,取得胜利。

        其实题意就是辗转相减法,我们可以用辗转相除法更方便。

#include <iostream>
#include <cstdio>

using namespace std;

inline int Game(int a, int b)
{
    int step = 0, c;
    while(b) //gcd
    {
        ++step;
        if(a / b > 1) return step & 1;
        c = a % b;
        a = b;
        b = c;
    }
    return step & 1;
}

int main()
{
    int n;
    int a, b;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d", &a, &b);
        if(a < b) swap(a, b);
        printf(Game(a, b) ? "Tongtong wins\n" : "Jiji wins\n");
    }
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10343865.html
今日推荐