B - Broken Rounding Editorial by cirno3153


別解を紹介します。

\(X\) を桁ごとに配列に入れ、長さ \(N\) の整数列だと思うことにします。

すると、数列の末尾から順に四捨五入と繰り上がりの処理を行えばよく、これは筆算と同じ要領で求められます。

計算量は \(O(\log X)\) です。

X, K = input().split()
X = list(map(int, list("0" + X))) # Xを桁ごとに分けてリストにする
K = int(K)
N = len(X)
if K >= N: print(0)# 自明に0になる答え
else:
  for i in reversed(range(N - K, N)):
    if X[i] >= 5: X[i - 1] += 1 # 繰り上がり
    X[i] = 0 # 四捨五入のどちらであってもこの桁は0になる
  for i in reversed(range(1, N - K)):
    if X[i] >= 10: X[i - 1] += 1 # 繰り上がり
    X[i] %= 10 # この桁に入るのは勿論一桁
  for start in range(N): # 先頭の0は除外する
    if X[start] != 0: break
  for i in range(start, N): print(X[i], end="")

posted:
last update: