Codeforces Beta Round #90 A: Epic Game
問題概要
ふたりのプレイヤーがゲームをする。それぞれある値A,Bを持っている。今、山にN(<100)個の石がある。各プレイヤーは交互に山からgcd(X, Y)(Xは自分の持っている値、Yは今山にある石の個数)だけ石を取り除く。石を取り除くことができなくなった方の負け。どちらが勝つか判定する問題。
考えたこと
- いつも思うけど、こういうのはゲームと言わないと思う。あえて言うなら作業ゲー。
- とはいえ、そう書かれていた方が問題文は理解しやすいのだけど。
- シミュレーションするだけ。
本番で通ったコード
計算量O(N*log N)くらい?忘れがちだけど、gcdの計算量はlog。
#include <cstdio> #include <algorithm> using namespace std; int N, A, B; int solve(){ int turn = 1; for(;;){ if(N == 0){ break; } if(turn){ N -= __gcd(A, N); } else{ N -= __gcd(B, N); } turn = 1 - turn; } return turn; } int main(){ scanf("%d%d%d",&A,&B,&N); printf("%d\n", solve()); return 0; }
for(;;)と書くくらいならwhile(N>0)の方がよかった気もする。