Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2766    Accepted Submission(s): 1594
代码风格太凌乱了导致没发现bug
#include <cstdio>
#include <cstring>
using namespace std;
int dayofmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int sg[45000];
bool isgapyear(int year){
    if(year%4==0&&(year%100!=0||year%400==0))return true;
    return false;
}
int getdofm(int year,int month){
    int ans=dayofmonth[month];
    if(month==1&&isgapyear(year))ans++;
    return ans;
}
int getdate(int year,int month,int day){
    int date=0;
    for(int i=1900;i<year;i++)date+=(isgapyear(i)?366:365);
    for(int i=0;i<month;i++){
        date+=getdofm(year,i);
    }
    date+=day;
    return date;
}
void getcalendar(int date ,int& year,int &month,int &day){
    int accu=0;
    for(int i=0;i<102;i++){
        accu+=(isgapyear(i+1900)?366:365);
        if(date<accu){
            year=i;date-=accu-(isgapyear(i+1900)?366:365);break;
        }
        else if(date==accu){
            year=i;day=31;month=11;return ;
        }
    }
    accu=0;
    for(int i=0;i<12;i++){
        int dm=getdofm(year+1900,i);
        accu+=dm;
        if(accu>date){
            month=i;
            date-=accu-dm;
            break;
        }
        else if(accu==date){
            month=i;
            date=dm;
            break;
        }
    }
    day=date;
}
int seg(int date){
    if(sg[date]!=-1)return sg[date];
    int year,month,day;
    getcalendar(date,year,month,day);
    if(seg(date+1)==0)return sg[date]=1;
    int ty,tm,td;getcalendar(date+getdofm(year+1900,month),ty,tm,td);
    if((day==td&&date+getdofm(year+1900,month)<=37198)&&seg(date+getdofm(year+1900,month))==0)return sg[date]=1;
    return sg[date]=0;
}
int main(){
    memset(sg,-1,sizeof(sg));
    sg[37198]=0;
    for(int i=37197 ;i>0;i--){
        seg(i);
    }
    int y,m,d;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&y,&m,&d);m--;
        int date=getdate(y,m,d);
        printf("%s\n",seg(date)==0?"NO":"YES");
   }
    return 0;
}
原文:http://www.cnblogs.com/xuesu/p/4104716.html