http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1024
#include <stdio.h>
#include <string.h>
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int t, y, m, d;
bool status[102][12][31];
bool IsLeapYear(int year)
{
return (year % 100 == 0 && year % 400 == 0) || (year % 100 != 0 && year % 4 == 0);
}
int GetDaysInMonth(int year, int month)
{
if(month == 2 && IsLeapYear(year))
return days[month-1] + 1;
return days[month-1];
}
bool HasSameDayNextMonth(int year, int month, int day)
{
return (month < 12) ? day < GetDaysInMonth(year, month + 1) : true;
}
void GetSameDayNextMonth(int year, int month, int day, int &nextm_y, int &nextm_m, int &nextm_d)
{
if(HasSameDayNextMonth(year, month, day))
{
if(month < 12)
{
nextm_y = year;
nextm_m = month + 1;
nextm_d = day;
}
else
{
nextm_y = year + 1;
nextm_m = 1;
nextm_d = day;
}
}
}
void GetNextDay(int year, int month, int day, int &next_y, int &next_m, int &next_d)
{
if(day + 1 <= GetDaysInMonth(year, month))
{
next_y = year;
next_m = month;
next_d = day + 1;
}
else
{
if(month + 1 <= 12)
{
next_y = year;
next_m = month + 1;
next_d = 1;
}
else
{
next_y = year + 1;
next_m = 1;
next_d = 1;
}
}
}
void GetLastDay(int year, int month, int day, int &last_y, int &last_m, int &last_d)
{
if(day - 1 > 0) // 2000/11/25
{
last_y = year;
last_m = month;
last_d = day - 1;
}
else
{
if(month - 1 > 0) // 2000/11/1
{
last_y = year;
last_m = month - 1;
last_d = GetDaysInMonth(last_y, last_m);
}
else // 2000/1/1
{
last_y = year - 1;
last_m = 12;
last_d = 31;
}
}
}
int main()
{
int year = 2001, month = 11, day = 4;
int nextm_y, nextm_m, nextm_d;
int last_y, last_m, last_d;
memset(status, true , sizeof(status));
status[year-1900][month-1][day-1] = false;
while(!(year == 1899 && month == 12 && day == 31))
{
GetLastDay(year, month, day, last_y, last_m, last_d);
if(status[year-1900][month-1][day-1] == false)
status[last_y-1900][last_m-1][last_d-1] = true;
else
{
if(HasSameDayNextMonth(last_y, last_m, last_d))
{
GetSameDayNextMonth(last_y, last_m, last_d, nextm_y, nextm_m, nextm_d);
if(status[nextm_y-1900][nextm_m-1][nextm_d-1] == false)
status[last_y-1900][last_m-1][last_d-1] = true;
else
status[last_y-1900][last_m-1][last_d-1] = false;
}
else
status[last_y-1900][last_m-1][last_d-1] = false;
}
year = last_y;
month = last_m;
day = last_d;
}
scanf("%d", &t);
while(t--)
{
scanf("%d %d %d", &y, &m, &d);
if(status[y-1900][m-1][d-1] == true)
printf("YES/n");
else
printf("NO/n");
}
}