Nimによる解法
最終盤面に着目すると、必ず は のいずれかになっていることが分かります。
一つの集合に着目したときに、 になる場合は 回の操作が、 になる場合は 回の操作が必ず行われます。
これは、次の様に 個全ての山が のNimとして考えることができます。
- 集合 から のいずれかを取り除くとき、山 から石を つ取り除く。
- 集合 から を取り除くとき、山 から石を つ取り除く。
よって、 が であるかどうかを考えればよく、これは が奇数の時に 、偶数の時に になります。
ここから、奇数の時にAlice、偶数の時にBobが勝つことが分かります。
真似っこ戦法による解法
が偶数の時を考えます。
Bobは以下の戦略によって必ず勝つことができます。
を満たす の個数を 、 または のうち一方のみを満たす の個数を とします。
ここで、 をどちらも偶数と仮定します。
最初は なので仮定は真です。
Aliceが前のターンで集合 から を取り除いたとします。
- の場合
- の場合
より、 なる が存在するので、 から のいずれかを取り除きます。
が だけ減り、仮定より も偶数です。 - の場合
より、同じように または のうち一方のみを満たす が存在するので、 から のいずれか存在する方を取り除きます。
が だけ減り、仮定より も偶数です。
- の場合
- の場合
より、 なる が存在するので、 から を取り除きます。
が だけ減り、仮定より も偶数です。
が奇数の時は、最初にAliceがいずれかの集合から を取り除くことで が偶数の場合に帰着でき、Aliceが必勝となります。
実装例(C++)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
int N;
cin >> N;
cout << (N % 2 ? "Alice" : "Bob") << endl;
}
}
ユーザー解説
ユーザー解説を書くユーザー解説はまだありません。