Problem:
Problem D: Friday the 13th

Problem

今年も「立命館大学競技プログラミング合宿」が開催されることとなった。僕は毎年開催されるこの合宿をとても楽しみにしている。しかし、欲望に耐え切れず合宿前に散財してしまい、お金に余裕が無くなってしまった。そこで僕は、立命館大学の最寄り駅である南草津まで移動するのに最も安く済む青春18きっぷを使うことにした。この切符は安く済む代わりに乗り換えが多く発生し、移動に丸1日使わなければならないのでとても疲れる。そんな移動をする日が13日の金曜日であることに気づいたのは会津若松駅を出発した後だった。僕は12時間、不安を感じながら電車に揺られるはめになった。

今日は合宿2日目、2015年3月15日、日曜日である。13日は特に何事もなく南草津に到着したが、僕はもうこのような不安を味わいたくないと思った。そこで2日目のジャッジである僕は、指定された期間内に存在する13日の金曜日の数を求める問題を出題し、プログラムを作成してもらうことにした。

閏(うるう)年の定義は以下の通りである。

西暦年が4で割り切れる年は閏年である。

ただし、100で割り切れる年は閏年でない。

ただし、400で割り切れる年は閏年である。

Input

空白で区切られた6つの整数Y1, M1, D1, Y2, M2, D2が1行で与えられる。

Constraints

入力は以下の制約を満たす。

1 ≤ Y1 ≤ Y2 ≤ 1018

1 ≤ Mi ≤ 12

1 ≤ Di ≤ 31 (Mi = 1, 3, 5, 7, 8, 10, 12)

1 ≤ Di ≤ 30 (Mi = 4, 6, 9, 11)

1 ≤ Di ≤ 28 (Mi = 2 かつ Yi年は閏年でない)

1 ≤ Di ≤ 29 (Mi = 2 かつ Yi年は閏年である)

Y1年M1月D1日はY2年M2月D2日より0日以上前の日付である

Output

Y1年M1月D1日からY2年M2月D2日までの間に存在する13日の金曜日の数を1行に出力せよ。

Sample Input1

2015 3 13 2015 3 13

Sample Output1

1

Sample Input2

2015 2 14 2015 3 15

Sample Output2

1

Sample Input3

1234 5 6 789012345678901234 5 6

Sample Output3

1357101234567708000

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static System.Math;

public static class P
{
    public static void Main()
    {
        var periodRes = Solve(new DateTime(400, 1, 1), new DateTime(799, 12, 31));

        var ymdymd = Console.ReadLine().Split().Select(long.Parse).ToArray();
        var y1 = (int)(ymdymd[0] % 400);
        var m1 = (int)ymdymd[1];
        var d1 = (int)ymdymd[2];
        var y2 = (int)(ymdymd[3] % 400);
        var m2 = (int)ymdymd[4];
        var d2 = (int)ymdymd[5];
        if (y2 < y1) y2 += 400;
        var date1 = new DateTime(y1 + 400, m1, d1);
        var date2 = new DateTime(y2 + 400, m2, d2);

        var period = ((ymdymd[3] - y2) - (ymdymd[0] - y1)) / 400;
        var res = period * periodRes + Solve(date1, date2);
        Console.WriteLine(res);
    }
    public static long Solve(DateTime start, DateTime end)
    {
        long res = 0;
        while (start <= end)
        {
            if (start.Day == 13 && start.DayOfWeek == DayOfWeek.Friday)
            {
                res++;
            }
            start = start.AddDays(1);
        }
        return res;
    }
}