AtCoder Beginner Contest 027 C 倍々ゲーム
ABC027のCが面白かったので。
問題概要
A, Bがゲームをする。正整数Nが与えられる。
で初期化する。
- を 倍するか、 倍した後、 を加算する
Aさんから行い、 を超える操作を行った方が負け。
解説
操作を言い換えると、次のようになります。
ここから、 回目の操作の後の は以下を満たすことがわかります。
ここで、 とします。
のときの、 を固定します。
つまり、このゲームの決着がつくのは、 回目か、 回目ということになります。
番目の人は、 の範囲は変えられませんが、 が を超えなければ勝てます。
従って、 番目の人は の値ができるだけ小さくなる操作( )を、
そうでない人は、 の値ができるだけ大きくなるような操作( )を行うことが最適となります。
解答
解答
from math import log2 def main(): N = int( input()) M = int( log2(N)) x = 1 for i in range(M): if M%2 == 0: if i%2 == 1: x = 2*x else: x = 2*x+1 else: if i%2 == 0: x = 2*x else: x = 2*x+1 if M%2 == 0: if x <= N: print("Aoki") else: print("Takahashi") else: if x <= N: print("Takahashi") else: print("Aoki") if __name__ == '__main__': main()