#include #include #include using namespace std; using namespace atcoder; using namespace __gnu_pbds; typedef long long ll; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define all(v) v.begin(), v.end() ll llpow(ll a, ll t) { ll res = 1; rep(i, t) res *= a; return res; } ll inf = std::numeric_limits::max(); using mint = modint; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; using pp = pair; // 0: l, 1: r, 2: u, 3: d vector dx = {0, 0, -1, 1}; vector dy = {-1, 1, 0, 0}; vector ds = {'L', 'R', 'U', 'D'}; // 素因数分解 // 460 = 2^2 x 5 x 23 の場合 // 返り値は {{2, 2}, {5, 1}, {23, 1}} vector> prime_factorize(long long N) { // 答えを表す可変長配列 vector> res; // √N まで試し割っていく for (long long p = 2; p * p <= N; ++p) { // N が p で割り切れないならばスキップ if (N % p != 0) { continue; } // N の素因数 p に対する指数を求める int e = 0; while (N % p == 0) { // 指数を 1 増やす ++e; // N を p で割る N /= p; } // 答えに追加 res.emplace_back(p, e); } // 素数が最後に残ることがありうる if (N != 1) { res.emplace_back(N, 1); } return res; } int main() { ll n; cin >> n; vector ms(n); rep(i, n) { cin >> ms[i]; } ll sum = 0; rep(i, n) { auto res = prime_factorize(ms[i]); for (auto p : res) { sum ^= p.second % 3; } } if (sum) { cout << "Alice" << endl; } else { cout << "Bob" << endl; } }