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



Sample input:
2015 3 13 2015 3 13


Sample output:
1

Submission status: Accepted

Solution code:
import datetime
y1,m1,d1,y2,m2,d2=map(int,input().split())
qq,y1=divmod(y1,400)
y1+=400
qq-=1
q=(y2-y1)//400
y2-=400*q
a=688*(q-qq)
d=datetime.date(y1,m1,d1)
while d<=datetime.date(y2,m2,d2):
    if d.day==13 and d.weekday()==4:a+=1
    d+=datetime.timedelta(days=1)
print(a)

Submission status: Accepted

Solution code:
def check_uruu(y):
    if y % 400 == 0:
        return True
    elif y % 100 == 0:
        return False
    elif y % 4 == 0:
        return True
    else:
        return False
nouruu = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
uruu = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Y1, M1, D1, Y2, M2, D2 = map(int, input().split())
L = [0] * (2800*366)
idx = 0
di, Y1 = divmod(Y1, 2800)
ans1 = di * 4816
di, Y2 = divmod(Y2, 2800)
ans2 = di * 4816

for y in range(0, 2800):
    if check_uruu(y):
        l = uruu
    else:
        l = nouruu
    for m, n_days in enumerate(l, 1):
        # if y==2015 and m==3:
        #     print(idx, idx + 12)

        d_13 = idx + 12
        if d_13 % 7 == 6:
            L[d_13] = 1

        if Y1==y and M1==m:
            ans1 += sum(L[:idx + (D1-1)])
        if Y2==y and M2==m:
            ans2 += sum(L[:idx + (D2)])

        idx += n_days
print(ans2-ans1)

Submission status: Runtime Error

Solution code:
import datetime
y1,m1,d1,y2,m2,d2=map(int,input().split())
q=(y2-y1)//400
y2-=400*q
a=688*q
d=datetime.date(y1,m1,d1)
while d<=datetime.date(y2,m2,d2):
    if d.day==13 and d.weekday()==4:a+=1
    d+=datetime.timedelta(days=1)
print(a)