hdu1846 Brave Game--巴什博奕

来源:互联网 发布:金十数据看白银 编辑:程序博客网 时间:2024/05/22 13:05

原题链接: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-6using 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;}
1 0