実験を行うと、 に対して、 のあまりに置き換えても解が変わらないことが分かります。(証明がうまくできない)
なので、 をソートし、キューなどを用いて、以下の操作を1周行えば、良いです。
# キュー構造が欲しいのでデックをインポート
from collections import deque
# 入力を受け取る
n, k = map(int, input().split())
a = list(map(int, input().split()))
# a の各要素に対して k の余りをとる
for i in range(n):
a[i] %= k
# 昇順でソートする
a.sort()
# a をデックにする
a = deque(a)
# 仮の答えを用意
min_diff = float("inf")
# 1~3 を各ループで行う
for _ in range(n):
# 1. max(a) - min(a) を求める
diff = a[n - 1] - a[0]
# 2. 比較を行い、小さい方を解にする
min_diff = min(min_diff, diff)
# 3. 先頭を取り出し、 k を足して後ろに入れる
top = a.popleft()
top += k
a.append(top)
print(min_diff)
提出コード(Rust)
https://atcoder.jp/contests/abc450/submissions/74545647