最短蓝题!
题目大意
有两堆石子,每次操作从一堆中取出偶数个(不为 0 0 0)石子,一半扔掉,一半放入另一堆中。无法操作者败。Alice 先手,问谁赢。
题解
设一堆有 a a a 个石子,另一堆有 b b b 个石子。
结论:当 ∣ a − b ∣ ≤ 1 |a-b|\le 1 ∣a−b∣≤1 时,先手必败。否则,先手必胜。
证明:
先考虑特殊情况:
- a = 0 , b = 0 a=0,b=0 a=0,b=0,先手必败
- a = 1 , b = 0 a=1,b=0 a=1,b=0 或 a = 0 , b = 1 a=0,b=1 a=0,b=1,先手必败
- a = 1 , b = 1 a=1,b=1 a=1,b=1,先手必败
当 ∣ a − b ∣ ≤ 1 |a-b|\le 1 ∣a−b∣≤1 时,先手从第一堆中取 2 x 2x 2x 个,于是 { a ′ = a − 2 x b ′ = b + x \begin{cases} a'=a-2x\\b'=b+x\end{cases} {a′=a−2xb′=b+x.
显然, b + x ≥ 2 x b+x\ge 2x b+x≥2x. 所以后手从另一堆中取 2 x 2x 2x 个, { a ′ ′ = a ′ + x = a − x b ′ ′ = b ′ − 2 x = b − x \begin{cases} a''=a'+x=a-x\\b''=b'-2x=b-x\end{cases} {a′′=a′+x=a−xb′′=b′−2x=b−x.
两次操作过后,又会变成 ∣ a − b ∣ ≤ 1 |a-b|\le 1 ∣a−b∣≤1,最终会变成上面的特殊情况,先手必败。
当 ∣ a − b ∣ > 1 |a-b|>1 ∣a−b∣>1 时,先手能够轻松地将情况变成 ∣ a − b ∣ ≤ 1 |a-b|\le 1 ∣a−b∣≤1,此时先手变成了后手,必胜。
时间复杂度 O ( 1 ) O(1) O(1).
代码
#include <bits/stdc++.h>
using namespace std;
long long a, b;
int main() {
scanf("%lld%lld", &a, &b);
if (abs(a - b) <= 1) printf("Brown");
else printf("Alice");
return 0;
}