#include #include #include using namespace std; // std::tuple 用のカスタムハッシュ関数 struct tuple_hash { template std::size_t operator ( )(const std::tuple& t) const { auto h1 = std::hash{}(std::get<0>(t)); auto h2 = std::hash{}(std::get<1>(t)); return h1 ^ (h2 << 1); // 2つのハッシュ値を組み合わせる } }; // メモ化用のハッシュマップ unordered_map, bool, tuple_hash> memo; // 再帰的に勝敗を判定する関数 bool canAliceWin(long long A, long long B) { // すでに計算した状態はメモ化された結果を返す if (memo.find(make_tuple(A, B)) != memo.end()) { return memo[make_tuple(A, B)]; } // ゲーム終了条件: どちらかの数が0なら、その時点で勝者が決定 if (A == 0) { return true; // Aliceの数が0になったのでBobの勝ち } if (B == 0) { return false; // Bobの数が0になったのでAliceの勝ち } // Aliceのターン // 1. Aliceが自分の数を1減らす if (!canAliceWin(A - 1, B)) { memo[make_tuple(A, B)] = true; return true; } // 2. Aliceが自分の数をBで割った余りにする(B <= Aの場合のみ) if (B <= A && !canAliceWin(A % B, B)) { memo[make_tuple(A, B)] = true; return true; } // Bobのターンになってしまう場合 memo[make_tuple(A, B)] = false; return false; } int main() { long long A, B; cin >> A >> B; if (canAliceWin(A, B)) { cout << "Alice" << endl; } else { cout << "Bob" << endl; } return 0; }