POJ 2505 - A multiplication game

http://poj.org/problem?id=2505

概要

初期状態 p = 1 から始めて,二人のプレイヤーが交互に2以上9以下の数を掛けていくゲームをする. 最初に p >= n としたプレイヤーを勝者とするとき,与えられた n に対して先手必勝か後手必勝か答える.

制約

解法

まず n を固定して考えると

であるため,

と判定できる.

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6   long long n;
 7   while (scanf("%lld", &n) != EOF) {
 8     long long p = 1;
 9     for (;;) {
10       p *= 9;
11       if (p >= n) {
12         puts("Stan wins.");
13         break;
14       }
15       p *= 2;
16       if (p >= n) {
17         puts("Ollie wins.");
18         break;
19       }
20     }
21   }
22   return 0;
23 }
poj/2505.cc