HDU 1846 Brave Game

题目分析

经典的巴什博弈例题。

\((m+1) \mid n\) 时,先手必败,否则先手必胜。
证明
假设\((m + 1) \mid n\),先手拿了 x 个, 后手就会拿 m+1-n 个 , 这样无论怎么拿,最后只会剩下 m+1 个,在这种情况下,无论先手拿 1~m 中的哪一个,都会剩下 m+1-x 个, 且 \(1 \leq m + 1 - x \leq m\), 因此后手可以将剩下的石头取光而必胜。

当上边假设不成立的情况时, 先手可以先取走 \(n \ \operatorname{mod} \ (m+1)\) 个 ,这样问题就转化成了后手面对 \((m+1) \mid n\) 个石子的情况了, 也就是这种情况的后手转化成了上一种情况的先手。因此在这种情况下先手必胜。

code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define N 100010
#define M 1010

using namespace std;
int T, n, m;

int read() {
	int s = 0, f = 0; char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
	return f ? -s : s;
}

int main() {
	T = read();
	while (T--) {
		n = read(), m = read();
		if (n % (m + 1) == 0) puts("second");
		else puts("first");
	}
	return 0;
}
posted @ 2020-09-07 07:47  Kersen  阅读(98)  评论(0编辑  收藏  举报