ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC216 C - Many Balls【Python解答例】

AtCoder Beginner Contest216のC問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 216 - AtCoder


AtCoder Beginner Contest216 C - Many Balls

C - Many Balls

問題文

空の箱があります。
髙橋君は以下の 2 種類の魔法を好きな順番で好きな回数使えます。

魔法 A :箱の中にボールを 1 つ増やす
魔法 B :箱の中のボールの数を 2 倍にする
合計 120 回以内の魔法で、箱の中のボールの数をちょうど N 個にする方法を 1 つ教えてください。
なお、与えられた制約のもとで条件を満たす方法が必ず存在することが示せます。

魔法以外の方法でボールの数を変化させることはできません。

制約

・1≤N≤10 ^18
・入力は全て整数

解答例

n = int(input())

res = ""
while n > 0:
    if n % 2 == 0:
        n = n // 2
        res = "B" + res
    else:
        n -= 1
        res = "A" + res

print(res)

解説

魔法Aでボールを1つ増やし、魔法Bでボールを2倍にするとき、ちょうどN個のボールを作る方法を答える問題です。

魔法の使う順番の文字列はresとしました。

魔法の順番を逆から見ていき、Nが偶数なら魔法Bを使い、奇数なら魔法Aを使うこととしてresに文字を格納していきました。

nが0になるまでwhile文でループさせ、nが偶数ならnを2で割り、文字列resの先頭にBを足します。
nが奇数ならnから1だけ引いて、文字列resの先頭にはAを足していきました。

この操作をnが0になるまで繰り返すことで求める答えとなりました。



ABC216の関連記事はこちら
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com