求SG
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=130;
const int year=1900;
int M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},leap[maxn];
int sg[maxn][13][32];
void Init()
{
memset(sg,-1,sizeof(sg));
sg[2001-year][11][4]=0;
for(int i=5;i<=M[11];i++)
sg[2001-year][11][i]=1;
for(int i=1;i<=M[12];i++)
sg[2001-year][12][i]=1;
for(int i=1900;i<=2001;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)
leap[i-year]=29;
else
leap[i-year]=28;
}
}
int SG(int y,int m,int d)
{
if(sg[y][m][d]!=-1)
return sg[y][m][d];
if(y>2001-year)
return 1;
if(m==12)
{
bool isa,isb;
if(d==M[12])
{
isa=SG(y+1,1,d);
isb=SG(y+1,1,1);
}
else
{
isa=SG(y,m,d+1);
isb=SG(y+1,1,d);
}
if((!isa)||(!isb))
return sg[y][m][d]=1;
return sg[y][m][d]=0;
}
if(m==1&&leap[y]<d||m>1&&M[m+1]<d)
{
bool is;
if(m==2&&d==leap[y]||d==M[m])
is=SG(y,m+1,1);
else
is=SG(y,m,d+1);
return sg[y][m][d]=is^1;
}
bool isa=SG(y,m+1,d),isb;
if(m==2&&d==leap[y]||m!=2&&d==M[m])
isb=SG(y,m+1,1);
else
isb=SG(y,m,d+1);
if((!isa)||(!isb))
return sg[y][m][d]=1;
return sg[y][m][d]=0;
}
int main()
{
Init();
int T;
scanf("%d",&T);
while(T--)
{
int y,m,d;
scanf("%d%d%d",&y,&m,&d);
if(SG(y-year,m,d))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}