タムログ

プログラミングについての情報発信をしていきます!

AtCoder Beginner Contest 161 C

AtCoder Beginner Contest 161 C 問題をPython で解説していきます。
まずは問題文から。
https://atcoder.jp/contests/abc161/tasks/abc161_c

C – Replacing Integer 


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 300 点

問題文

青木君は任意の整数 x に対し、以下の操作を行うことができます。

操作: x を x と K の差の絶対値で置き換える。

整数 N の初期値が与えられます。この整数に上記の操作を 0 回以上好きな回数行った時にとりうる N の最小値を求めてください。

制約

  • 0≤N≤10^18
  • 1≤K≤10^18
  • 入力は全て整数

入力

入力は以下の形式で標準入力から与えられる。

N K

出力

操作を 0 回以上好きな回数行った時にとりうる N の最小値を出力せよ。

解説

x と K の差の正負によって絶対値の値は変化するので,正味の操作は以下の2通りになります。

  • x – K > 0 の時:x -> x – K
  • x – K < 0 の時:x -> -(x – K)

なので,x – K > 0 であるときは常にx から K を引き続けていき,x – K < 0 になるまでその操作が続きます。
この操作を行う回数は, N を K で割った時の商になります。よって,その操作を行う回数を l とすると,
N – l * K > 0
となるような最大の n を求めてあげると,l + 1 回目の操作では,
(N – l * K) – K < 0
になるので,この値の絶対値を取ることになります。
よって,この2つの数の大小を比較すればいいことになります。
すなわち,出力すべきは

min(N - l * K, abs((N - l * K) - K) 

になります。

解答

n, k = map(int, input().split())

l = n // k

print(min(n - l * k, abs((n - l * k) - k)))