/* -*- coding: utf-8 -*- * * 103.cc: No.103 素因数ゲーム リターンズ - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 100; const int MAX_P = 10000; const int MAX_F = 14; // 2^14 = 16384 > 10000 const int INF = 1 << 30; /* typedef */ typedef vector vi; typedef pair pii; typedef vector vpii; /* global variables */ bool primes[MAX_P + 1]; int ms[MAX_N], gndys[MAX_F + 1]; /* subroutines */ void gen_primes(int maxp, vi &pnums) { memset(primes, true, sizeof(primes)); primes[0] = primes[1] = false; int p; for (p = 2; p * p <= maxp; p++) if (primes[p]) { pnums.push_back(p); for (int q = p * p; q <= maxp; q += p) primes[q] = false; } for (; p <= maxp; p++) if (primes[p]) pnums.push_back(p); } bool prime_decomp(int n, vi &pnums, vpii& pds) { pds.clear(); int pn = pnums.size(); for (int i = 0; i < pn; i++) { int pi = pnums[i]; if (pi * pi > n) { if (n > 1) pds.push_back(pii(n, 1)); return true; } if (n % pi == 0) { int fi = 0; while (n % pi == 0) n /= pi, fi++; pds.push_back(pii(pi, fi)); } } return false; } /* main */ int main() { vi pnums; gen_primes(MAX_P, pnums); gndys[0] = 0; gndys[1] = 1; for (int i = 2; i <= MAX_F; i++) { bool used[3] = {0}; used[gndys[i - 2]] = used[gndys[i - 1]] = true; for (int j = 0; j < 3; j++) if (! used[j]) { gndys[i] = j; break; } } int n; cin >> n; vi fs; for (int i = 0; i < n; i++) { int mi; cin >> mi; vpii pds; prime_decomp(mi, pnums, pds); for (int j = 0; j < pds.size(); j++) fs.push_back(pds[j].second); } int fn = fs.size(), nim = 0; for (int i = 0; i < fn; i++) nim ^= gndys[fs[i]]; //for (int i = 0; i < fn; i++) printf("%d ", fs[i]); putchar('\n'); //for (int i = 0; i < fn; i++) printf("%d ", gndys[fs[i]]); putchar('\n'); //printf("nim=%d\n", nim); cout << ((nim != 0) ? "Alice" : "Bob") << endl; return 0; }