Problem:
ニッシン館マラソン部

アイヅ市立ニッシン館は、文武両道を掲げる歴史ある学校です。ニッシン館マラソン部は熱血指導で有名であり、決められた練習時間の間、周回コースをひたすら走るという鬼の特訓を行います。このとき、脱水症状で倒れる部員がいないように、部員の実力に合わせて飲み物を提供する給水所を設けています。

各部員が１単位時間あたりに走れる距離(ペース)は部員ごとに決まっており、全員が１単位時間ごとに必ず給水できるように給水所を設けたうえで特訓を行います。部員は 1 単位時間で着いた給水所で必ず中身の入った容器を取り、そのまま走り続けます。さらに、次の１単位時間で着いた給水所で空の容器を置き、中身の入った容器を取って走り続けるということを繰り返します。また、空の容器は、置いてから 1 単位時間の時点で飲料が補充され、その瞬間から誰にでも提供できるようになります。

部員は全員同じ地点から、容器を持たずに出発します。決められた練習時間まで走ると練習を終えます(このときも給水が必要です)。複数の部員が同時に同じ給水所に到着する場合もあるので、一か所の給水所で同時に複数の容器が必要になることもあります。

鬼の特訓を安全に行うために、最低いくつの給水容器が必要になるか求めるプログラムを作成してください。

入力

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

N R T
p1
p2
:
pN

１行目に部員の数 N (1 ≤ N ≤ 100)、周回コースの長さ R (1 ≤ R ≤ 1000)、決められた練習時間 T (1 ≤ T ≤ 1000) が与えられる。続く N 行に、部員 i のペース pi (1 ≤ pi ≤ 1000) が与えられる。

出力

最低いくつの給水容器が必要になるかを１行に出力する。

入出力例

入力例１

1 10 20
1

出力例１

11

入力例２

2 5 12
1
2

出力例２

8

Solution in C# (judge verdict: Accepted)

using System.Collections.Generic;
using System;

public class hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = int.Parse(line[0]);
        var r = int.Parse(line[1]);
        var t = int.Parse(line[2]);
        var p = new int[n];
        for (int i = 0; i < n; i++) p[i] = int.Parse(Console.ReadLine().Trim());
        var ans = goSim(n, r, t, p);
        Console.WriteLine(ans);
    }
    static int goSim(int n, int r, int t, int[] p)
    {
        var np = new int[r];
        var up = new int[r];
        var pp = new int[r];
        var ans = n;
        for (int i = 0; i < n; i++)
        {
            pp[i] = p[i];
            if (pp[i] >= r) pp[i] %= r; ;
        }
        var tt = 1;
        while (tt < t)
        {
            var plist = new List<int>();
            for (int i = 0; i < n; i++)
            {
                pp[i] += p[i];
                if (pp[i] >= r) pp[i] %= r;
                var ppi = pp[i];
                if (!plist.Contains(ppi)) plist.Add(ppi);
                up[ppi]++;
                if (np[ppi] >= 1) np[ppi]--;
                else ans++;
            }
            foreach (var x in plist)
                if (up[x] > 0) { np[x] += up[x]; up[x] = 0; }
            tt++;
        }
        return ans;
    }
}