这题我先建了表来做的。
可以进行两个操作:
1、把其中一个数变为比它小的数;
2、把其中一个数字0及其右边的所以数字删除。
两人轮流进行操作,
//Time 281ms, Memory 4140
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000000; int sg[maxn]={0}; int len(int n) { if(n/100000) return 6; if(n/10000) return 5; if(n/1000) return 4; if(n/100) return 3; if(n/10) return 2; return 1; } void mex(int n) { int l=len(n); for(int i=l;i>0;i--) //1、把其中一个数变为比它小的数; { int m=1; for(int j=1;j<i;j++) m*=10; int t=(n%(m*10))/m; for(j=1;j<=9-t;j++) sg[n+m*j]=1; } if(l<6) //2、把其中一个数字0及其右边的所以数字删除。 { int m=n,a=1; for(int i=1;i<=6-l;i++) { m*=10; for(int j=0;j<a;j++) { sg[m+j]=1; } a*=10; } } } void f() { sg[0]=1; for(int i=1;i<maxn;i++) if(!sg[i]) // 这方法与素数筛选法有异曲同工之妙。 { mex(i); } } int main() { int l,n; char s[7]; f(); while(scanf("%s",s)!=EOF) { if(s[0]=='0') { printf("Yes\n");continue; } l=strlen(s); n=s[0]-'0'; for(int i=1;i<l;i++) n=n*10+s[i]-'0'; if(sg[n]) printf("Yes\n"); else printf("No\n"); } return 0; }