AT2400 题解

前言

题目传送门!

更好的阅读体验?

博弈论真好玩!

思路

显然,\(\begin{cases}n=0\\m=0\end{cases}\space\begin{cases}n=1\\m=0\end{cases}\space\begin{cases}n=0\\m=1\end{cases}\space\begin{cases}n=1\\m=1\end{cases}\space\)时,先手必输。

于是可以猜测,当 \(|n - m| \le 1\) 时,先手必输;否则先手必胜。然后 AC 了,于是下一题。

接下来,证明这个结论是正确的。

\(|n - m| \le 1\) 时,假设先手从第一堆中取出了 \(2x\) 个石子。

根据题目,石子数会变成:\(\begin{cases}n^{'} = n - 2x\\m^{'} = m+ x\end{cases}\space\) 这时轮到后手。

此时,后手只需要在 \(m^{'}\) 里同样取 \(2x\) 个石子即可。由于 \(n\)\(m\) 差最大为 \(1\),所以 \(m^{'}\) 一定会大于 \(2x\)

那么,石子数会变成:\(\begin{cases} n^{''} = n^{'} + x = n - x\\m^{''} = m^{'} - 2x = m - x\end{cases}\space\) 于是 \(|n^{''} - m^{''}|\) 同样会小于等于 \(1\)

这样每次,先手都会获得 \(|n - m| \le 1\) 的石子数。由于每次 \(n\)\(m\) 都会减少,所以迟早会变成最开始的四种情况之一。

综上,\(|n - m| \le 1\) 时先手必败。

\(|n - m| > 1\) 呢?先手很容易将情况变为 \(|n - m| \le 1\),于是现在的后手,变成了上一种情况的先手。

\(|n - m| > 1\) 时先手必胜。

于是就证毕啦!

完整代码

这还需要代码吗?

#include <iostream>
#include <cstdio>
#include <cmath>
int main()
{
	long long n, m;
        cin >> n >> m;
	if (abs(n - m) <= 1) puts("Brown");
	else puts("Alice");
	return 0;
}
posted @ 2022-09-17 16:12  liangbowen  阅读(60)  评论(0)    收藏  举报