Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

B: 重さの範囲

問題

重さの異なる $N$ 色のボールがキューにたくさん入っています。キューには、先頭から
$1,2,3, \dots ,N-1,N,1,2,3, \dots ,N-1,N,1,2,3, \dots$ というふうに昇順にボールが並んでいて、
色 $N$ のボールの後ろにはまた色 $1$ のボールから順に入っています。
同じ色のボールはそれぞれ同じ重さであり、色 $i$ のボールの重さは $A_i$ です。

この状態から、キューの先頭からボールを $M$ 個取り出し、これを 1 つのグループとする作業を繰り返します。
そして、キューから取り出した各色のボールの総数がすべて等しくなったときにグループを作る作業をやめます。
なお、キューには十分な数のボールが入っており、グループを作る作業をやめるまでにキューの中身が空になることはありません。

たとえば、
$N=8, M=2$ のとき、{色1,色2}, {色3,色4}, {色5,色6}, {色7,色8} の 4 グループができます
(このとき各色のボールは 1 つずつ存在する)。
$N=4, M=3$ のとき、{色1,色2,色3}, {色4,色1,色2}, {色3,色4,色1}, {色2,色3,色4} の $4$
グループができます (このとき各色のボールはそれぞれ3つずつ存在する)。

このとき、各グループにおいて、
含まれるボールの重さの最大値と最小値の差をそのグループの重さの範囲と呼ぶことにします。
各グループの重さの範囲の総和を出力してください。

制約

$1 \le N \le 1000$

$1 \le M \le N$

$0 \le A_i \le 100$

入力は全て整数である

入力形式

入力は以下の形式で与えられます。

$N \ M$

$A_1 \cdots A_N$

出力

答えを 1 行で出力してください。また、末尾に改行も出力してください。

サンプル

サンプル入力 1

8 2
23 61 57 13 91 41 79 41

サンプル出力 1

170

重さの範囲の総和は $38+44+50+38=170$ となります。

サンプル入力 2

4 3
72 46 67 5

サンプル出力 2

222

重さの範囲の総和は $26+67+67+62=222$ となります。

サンプル入力 3

4 2
1 2 3 5

サンプル出力 3

3

重さの範囲の総和は $1+2=3$ となります。

Solution in Ruby (judge verdict: Accepted)

require "prime"

n, m = gets.chomp.split.map(&:to_i)
weight = gets.chomp.split.map(&:to_i)
pd1 = Prime.prime_division n
pd2 = Prime.prime_division m
h = Hash.new(0)
[pd1, pd2].each{|pd| pd.each{|p, n| h[p] = n if h[p] < n}}
lcm = 1
h.each{|k, v| lcm *= (k ** v)}
i = j = sum = 0
min, max = 100, 0
lcm.times{
    min = weight[i] if min > weight[i]
    max = weight[i] if max < weight[i]
    if j == m - 1
        sum += (max - min)
        min, max = 100, 0
    end
    i = (i + 1) % n
    j = (j + 1) % m
}
puts sum