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;
}