はじめに
今週は日曜開催なんですね。
成績:AB2完(300)
A
"o" * nとすればoをn個出力できる。
n = int(input())
print("L" + "o"*(n) + "n" + "g")
B
bin()で10進数から2進数に変換できるので、変換した後に末尾から順に確認していき、0ならカウント、1ならループを抜ければ良い。
n = int(input())
chara = bin(n)
cnt = 0
for i in range(-1, -len(chara), -1):
if chara[i] == "0":
cnt += 1
else:
break
print(cnt)
C
「良い整数」は$p$桁目の数字が$5^{p-1}$ごとに0, 2, 4, 6, 8と変化し、$5^p$で一巡するという挙動をする。
なので、$p$桁目の数は$n-1$を$5^{p-1}$で割った商を5で割ったあまりに2をかけることで求められる。例えば$n$を5で割って商が0なら2桁目の数字は2、商が1なら4……となる。この商をさらに5で割っているのは、商が5なら商が0の時と同じことになるから。
1番目の数が0なので$n-1$を割らないとといけないこと、1桁目については値がずれることに気を付けて実装する。
import math
def whatnum(n, p):
return (n-1)//(5**(p-1))%5*2
n = int(input())
if n == 1:
keta = 1
else:
keta = math.floor(math.log(n-1,5)+1) #桁数を算出する。
ans = []
for i in range(keta, 1, -1):
ans.append(str(whatnum(n,i)))
if n%5 == 1:
ans.append(str(0))
if n%5 == 2:
ans.append(str(2))
if n%5 == 3:
ans.append(str(4))
if n%5 == 4:
ans.append(str(6))
if n%5 == 0:
ans.append(str(8))
print(''.join(ans))
ずいぶんと不格好になってしまった。まず桁数を確認してから下一桁以外はwhatnumという関数を定義して判定していき、下一桁はnを5で割った余りで対応するという方針。下一桁の処理はもっとやりようがある気がする……
また、joinを使って出力する際に文字列でないとエラーになるので文字列にしてからappendするという方法を取っている。
今回も考察不足のまま進んでしまうという悪癖が出た。各桁の数字がnに対してどのような挙動をするのかちゃんと考察できていなかったので、各桁の数字判定ができるようになるまで時間がかかってしまい時間切れに。ACできたのは終了5分後でした。
ちゃんと事象を理解し切ってから実装に進まないとダメ。
ちなみにn-1を5進数に変換するという発想ですぐ解けるらしい。言われてみればそうだ……ただそれに気づいたとしても、5進数への変換に手間取っていたような気もする。この変換方法は一度しっかり確認しておく必要がありそう。
日本代表が前半で3-0くらいにしてくれていればこんなことには……(言い訳)