题目描述
桐桐正在和同桌吉吉玩一种数字游戏。游戏规则是这样的:给定两个正整数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; }