【题目】
Description
十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻。
今天,大家选择上机考试,就是一种勇敢(brave)的选择;这个短学期,我们讲的是博弈(game)专题;所以,大家现在玩的也是 “ “ “勇敢者的游戏 ” ” ”,这也是我命名这个题目的原因。
当然,除了 “ “ “勇敢 ” ” ”,我还希望看到 “ “ “诚信 ” ” ”,无论考试成绩如何,希望看到的都是一个真实的结果,我也相信大家一定能做到的~
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
- 本游戏是一个二人游戏;
- 有一堆石子一共有 n n n 个;
- 两人轮流进行;
- 每走一步可以取走 1 … m 1…m 1…m 个石子;
- 最先取光石子的一方为胜。
如果游戏的双方使用的都是最优策略,请输出哪个人能赢。
Input
输入数据首先包含一个正整数 c c c( c ≤ 100 c\le100 c≤100),表示有 c c c 组测试数据。
每组测试数据占一行,包含两个整数 n n n 和 m m m( 1 ≤ n , m ≤ 1000 1\le n,m\le1000 1≤n,m≤1000), n n n 和 m m m 的含义见题目描述。
Output
如果先走的人能赢,请输出 “first”,否则请输出 “second”,每个实例的输出占一行。
Sample Input
2
23 2
4 3
Sample Output
first
second
【分析】
巴什博奕的模板题啦。
我们先来简单找一下规律吧。
分情况考虑:
- 若 n ≤ m n\le m n≤m,那么显然先手必胜。
- 若 n = m + 1 n=m+1 n=m+1,无论先手那几个,后手都可以一次性拿完,所以先手必败。
- 若 m + 2 ≤ n ≤ 2 m + 1 m+2\le n\le 2m+1 m+2≤n≤2m+1,那先手可以拿几个,使石子剩下 m + 1 m+1 m+1 个,先手必胜。
- 若 n = 2 m + 2 n=2m+2 n=2m+2,那么先手拿过之后,石子数就在区间 [    m + 2    ,    2 m + 1    ] [\;m+2\;,\;2m+1\;] [m+2,2m+1] 里,就是情况三 3 3 3,先手必败。
- ⋯ ⋯ \cdots\cdots ⋯⋯
不难发现当 n % ( m + 1 ) = 0 n\%(m+1)=0 n%(m+1)=0 时先手必败,否则先手必胜。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,m,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
puts(n%(m+1)?"first":"second");
}
return 0;
}