007 - 素数の日の並び
時間制限 2 秒 / メモリ制限 256 MB / 得点 10 / x 0 /
問題
日 | 月 | 火 | 水 | 木 | 金 | 土 |
30 | 31 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
1週間にはある月に属する日だけではなく、その前の月の日や、その次の月の日も含まれることがある。たとえば2022年11月1日が含まれる週から、12月31日が含まれる週までの週の並びを見ると、右の図のようになっている。
このような週の並びで、日曜日から土曜日までの1週間分の日の並びに、最大でいくつの素数の日が入っているかを考える。右の図の場合、各週の素数の日は以下のようになる。
1週目の素数の日は31、2、3、5の4つ。
2週目の素数の日は7, 11の2つ。
3週目の素数の日は13, 17, 19の3つ。
4週目の素数の日は23だけで1つ。
5週目の素数の日は29, 2, 3の3つ。
6週目の素数の日は5, 7の2つ。
7週目の素数の日は11, 13, 17の3つ。
8週目の素数の日は19, 23の2つ。
9週目の素数の日は29, 31の2つ。
つまり、2022年11月1日が含まれる週から12月31日が含まれる週までのうち、素数の日の数の最大値は4で、そのような週の数は1である。このように、週を常に日曜日から始める7日間としたとき、素数の日の数が最大になる週が、ある期間において何度現れるだろうか? ただし、西暦2000年1月1日は土曜日とする。また、4で割り切れてかつ100で割り切れないか、400で割り切れる年は閏年とする。1月、3月、5月、7月、8月、10月、12月は31日まで、2月は28日まで(ただし閏年では29日まで)、他の月は30日まである。
開始年月と終了年月が与えられたとき、その開始年月の1日が含まれる週から、終了年月の最後の日が含まれる週までの期間において、一つの週に現れる素数の日の数の最大値と、素数の日の数が最大になる週の数を求めるプログラムを作成せよ。
入力
入力は以下の形式で与えられる。
$y_1$ $m_1$ $y_2$ $m_2$
1行目に開始年$y_1$ ($2000 \leq y_1 \leq 100,000,000$)と開始月$m_1$ ($1 \leq m_1 \leq 12$)、2行目に終了年$y_2$ ($y_1 \leq y_2 \leq 100,000,000$)と終了月$m_2$ ($1 \leq m_2 \leq 12$)が与えられる。ただし、$y_1 = y_2$のときは $m_1 \leq m_2$とする。
出力
一つの週に現れる素数の日の数の最大値と、素数の日の数が最大になる週の数を、空白区切りで1行に出力する。
入出力例
入力例1
2022 1 2022 12
出力例1
4 8
入力例2
2003 9 2022 11
出力例2
4 156