CCFシリーズ問題解--2015年3月第三題祝日


問題の説明
祝日の日付が決まっているのではなく、「a月のb番目の日曜日c」という形で決まっているものがあります.例えば、母の日は毎年5月の2番目の日曜日に決まっています.今、あなたにa,b,cとy 1,y 2(1850≦y 1,y 2≦2050)をあげて、西暦y 1年から西暦y 2年までの毎年のa月のb週目のcの日付を出力してほしいです.ヒント:閏年のルールについて:年が400の整数倍の場合は閏年、そうでない場合は年が4の倍数で100の倍数でない場合は閏年、その他の年は閏年ではありません.たとえば、1900年は閏年ではなく、2000年は閏年です.あなたの推計を容易にするために、1850年1月1日が火曜日であることが知られています.
入力フォーマット
入力にはちょうど1行が含まれ、5つの整数a,b,c,y 1,y 2がある.このうちc=1,2,…,6,7はそれぞれ月曜日,二,…,六,日を表す.
出力フォーマット
y 1とy 2の間の各年について、y 1とy 2を含め、年の小さい順に1行出力します.この年のa月第b週cが確かに存在する場合、「yyyy/mm/dd」の形式で出力されます.すなわち、4桁の年、2桁の月、2桁の日付、中間はスラッシュ「/」で区切られ、桁が不足した場合にはゼロになります.この年のa月第b週cが存在しない場合は、「none」(二重引用符を含まない)を出力します.
サンプル入力
5 2 7 2014 2015
サンプル出力
2014/05/112015/05/10
評価用例の規模と約束
すべての評価例は、1≦a≦12、1≦b≦5、1≦c≦71850≦y 1、y 2≦2050を満たす.
#include
#include
#include
#include
#include
using namespace std;
const int month[]={31,28,31,30,31,30,31,31,30,31,30,31};
bool is_year(int n) //     
{
	return n%400==0||n%4==0&&n%100!=0;
}
int main()
{
	int a,b,c,y1,y2;
	scanf("%d%d%d%d%d",&a,&b,&c,&y1,&y2);
	int t=2;
	c%=7; //0     
	for(int i=1850;i<=y2;i++)
	{
		if(i>=y1) //     
		for(int j=0;j<12;j++)
		{
			if(j==a-1) //     
			{
				int v=(c+7-t)%7+1;
				v+=(b-1)*7; //     
				if(v>month[j]+(j==1&&is_year(i))?1:0) printf("none
"); // else printf("%04d/%02d/%02d
",i,j+1,v); } t+=month[j]; if(j==1&&is_year(i)) t++; t%=7; } else { t+=365; if(is_year(i)) t++; t%=7; } } return 0; }