呵呵 写了一天。。
这题状态不多(10^6我次奥),可以用sg函数来搞一搞。
重点是不需要求sg[k]的值具体是什么啊!sg=0就是必败,sg=1就是必胜了啊!!!
那就跟正常的dfs一样了。
如果找到后续的必败态,那么当前就是必胜态了。
如果找不到后续全是必胜态了嘛。。当前肯定必败啊。。
#include<cstdio> #include<cstring> #include<vector> #include<algorithm> #include<iostream> using namespace std; int sg[1000010]; int dfs(int k){ if(sg[k]!=-1)return sg[k]; int i,kk; for(i=1;i<=k;i*=10){ if(k/i%10){ kk=k; do{ kk-=i; if(kk<i)break; if(!sg[kk])return sg[k]=1; }while(kk/i%10); } else if(!sg[k/i/10])return sg[k]=1; } return sg[k]=0; } int main(){ char s[10]; int i,sum; memset(sg,-1,sizeof(sg)); sg[0]=1; for(i=1;i<1000010;i++) dfs(i); while(~scanf("%s",s)){ if(s[0]=='0'){ puts("Yes"); continue; } sum=0; for(i=0;s[i];i++){ sum*=10; sum+=s[i]-'0'; } puts(sg[sum]?"Yes":"No"); } return 0; }