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 C# (judge verdict: Accepted)

using static System.Math;
using System;

public class Hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = int.Parse(line[0]);
        var m = int.Parse(line[1]);
        line = Console.ReadLine().Trim().Split(' ');
        var a = Array.ConvertAll(line, int.Parse);
        var gtmax = 0; var gtmin = 0;
        var gmax = 0;
        var gmin = int.MaxValue;
        var count = 0;
        var imax = n * m / gcd(n, m);
        for (int i = 0; i < imax; i++)
        {
            var t = i % n;
            gmax = Max(gmax, a[t]);
            gmin = Min(gmin, a[t]);
            count++;
            if (count == m)
            {
                gtmax += gmax;
                gmax = 0;
                gtmin += gmin;
                gmin = int.MaxValue;
                count = 0;
            }
        }
        Console.WriteLine(gtmax - gtmin);
    }
    public static int gcd(int a, int b)
    {
        if (a < b) return gcd(b, a);
        while (b != 0)
        {
            var w = a % b;
            a = b;
            b = w;
        }
        return a;
    }
}