原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846
分析:
如果 n = m + 1, 一次至多取 m 个,所以无论先取者,取了多少个,一定还剩余 x 个( 1 ≤ x ≤ m)。所以,后取者必胜。因此我们发现了取胜的秘诀:如果我们把 n 表示为n = (m + 1) * r + s 。(0 ≤ s < m , r ≥ 0)。
先取者 拿走 s 个, 后取者 拿走 k 个 (1 ≤ k ≤ m),那么先取者 再 拿走 m + 1 - k 个。结果还剩下 ( m + 1 ) * ( r - 1 ) 个。我们只要始终给对手留下 m + 1 的倍数,那么 先取者 肯定必胜。 现在 我们可以知道,如果 s = 0,那么后取者必胜。 否则 先取者 必胜。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 1000000000
#define EPS 1e-6
using namespace std;
int T;
int n, m;
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
if (n % (m + 1) == 0)
printf("second\n");
else
printf("first\n");
}
return 0;
}