这是一道 SG S G 函数的板子题。不知道的自行百度。
然后就是痛快的 SG S G 函数AC。
#include
using namespace std;
int SG[2221220];//等于1是对手下了这里有必胜策略
int Y,M,D;
const int inf =2221219;
inline int js(register int y,register int m,register int d){
return (y-1899)*10000+m*100+d;
}
inline bool pd(register int y,register int m,register int d){
if(y>=2002)return false;
if(y>=2001&&m>=11&&d>4)return false;
if(y<1900)return false;
if(m>12)return false;
if(m<=0)return false;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
if(d>=32)return false;
else return true;
}
if(m==4||m==6||m==9||m==11){
if(d>=31)return false;
else return true;
}
if(m==2&&y%4==0&&y!=1900){
if(d>=30)return false;
else return true;
}
if(m==2&&d>=29)return 0;
return 1;
}
inline int jf(register int y,register int m,register int d){
if(pd(y,m,d+1)){
return js(y,m,d+1);
}
if(pd(y,m+1,1)){
return js(y,m+1,1);
}
if(pd(y+1,1,1))return js(y+1,1,1);
return inf;
}
inline int bf(register int y,register int m,register int d){
if(pd(y,m+1,d)){
return js(y,m+1,d);
}
if(m==12)if(pd(y+1,1,d))return js(y+1,1,d);
return inf;
}
inline int mex(register int a){
if(a==0)return 1;
else return 0;
}
inline int mex2(register int a,register int b){
if(a>b)swap(a,b);
if(a>=1)return 0;
if(b==1)return 2;
else return 1;
}
int main(){
//freopen("calendar.in","r",stdin);
//freopen("calendar.out","w",stdout);
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--){
cin>>Y>>M>>D;
memset(SG,1,sizeof(SG));
//SG[2221219]=1;
register int STD=js(2001,11,4);
SG[STD]=0;
for(register int i=2001;i>=Y;--i){
for(register int j=12;j>=1;--j){
for(register int k=31;k>=1;--k){
if(!pd(i,j,k))continue;
register int a=jf(i,j,k),b=bf(i,j,k);
if(a>STD&&b>STD)continue;
if(a>STD){SG[js(i,j,k)]=mex(SG[b]);continue;}
if(b>STD){SG[js(i,j,k)]=mex(SG[a]);continue;}
SG[js(i,j,k)]=mex2(SG[a],SG[b]);
}
}
}
if(SG[jf(Y,M,D)]==0||SG[bf(Y,M,D)]==0){
puts("YES");
}
else puts("NO");
}
}