No.103 素因数ゲーム リターンズ
No.103 素因数ゲーム リターンズ - yukicoder
- 最初 grundy 数とか計算してたけど、素数を山の種類、冪を山の高さとする Nim と考えと素因数分解して xor を取るだけだった。
- 初期状態で決まる勝ち負け状態を保ったまま山の高さを k%3 まで遷移させることができるので、最初から山が k%3 だと考えてよい。
class PrimeGameReturns { public: void solve(void) { int N; cin>>N; int det = 0; REP(i,N) { int m; cin>>m; // 素数を山の種類、冪を山の高さとする Nim と考える auto primes = primeFactorize(m); for (auto pk : primes) { int p,k; tie(p,k) = pk; // 初期の勝ち負け状態をたもったまま k%3 まで遷移させることができる // (ある山から相手が 1(2) をとったら自分は 2(1) を取ればよい。) det = det ^ (k % 3); } } if (det) cout<<"Alice"<<endl; else cout<<"Bob"<<endl; } };