https://beta.atcoder.jp/contests/agc010/tasks/agc010_d
やっぱこういうのは偶奇ですね…。
操作を良く観察すると、奇数で割っても偶奇が変わらないことに気づきます。
なので列に奇数が2つ以上ある場合、または奇数が1つでもそれが1の場合、結局1ずつdecrementしていく作業と同じなので勝敗がわかります。
奇数が1つの場合はもう少し複雑で、どれか1つを偶数→奇数にして勝てるならそうして、それでも勝てなかったら奇数をdecrementしてA全体を最大公約数で割ります。この時2の階乗のみで割ると不十分なことに注意してください。
N=3,A={7,12,12}の時とか、7をdecrementして6ではなく2で割って、{3, 6, 6}にして考えると違う結果が出ます。それでWA出した。
ll gcd(ll a, ll b) { if(b == 0) return a; else return gcd(b, a % b); } int N; ll A[MAX_N]; bool sub_solve() { if(N == 1) return (A[0] - 1) % 2; bool second = false; while(true) { // debug(vi(A, A + N)); int odd = 0; bool one = false; rep(i, 0, N) { if(A[i] % 2) odd++; if(A[i] == 1) one = true; } if((N - odd) % 2) return (second ^ 1); else if(odd != 1 || one) return second; else { if(A[0] % 2) A[0]--; ll g = A[0]; rep(i, 0, N) { if(A[i] % 2) A[i]--; g = gcd(g, A[i]); } rep(i, 0, N) A[i] /= g; } second ^= 1; } } void solve() { cin >> N; rep(i, 0, N) cin >> A[i]; if(sub_solve()) { cout << "First\n"; } else cout << "Second\n"; }