sg函数,能到达0的点,赋值为1.
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<vector>
#include<map>
#include<string>
using namespace std;
#define ll long long
int sg[1000010];
char ch[6];
int G(int x)
{
if(sg[x]!=-1) return sg[x];
int i=1,k,j,t,flag;
while(x/i)
{
flag=(x/(i*10))?0:1;
t=x/i%10;
if(t==0)
{
if(sg[x/(i*10)]==0)
return sg[x]=1;
i*=10;
continue;
}
k=x-(t-flag)*i;
for(j=flag;j<t;j++)
{
if(sg[k]==0)
return sg[x]=1;
k+=i;
}
i*=10;
}
return sg[x]=0;
}
int main()
{
memset(sg,-1,sizeof(sg));
int i,j,k;
sg[0]=1;
for(i=1;i<1000000;i++)
G(i);
while(cin>>ch)
{
if(ch[0]=='0')
{
printf("Yes\n");
continue;
}
int len=strlen(ch);
int sum=0;
for(i=0;i<len;i++)
{
sum=sum*10+ch[i]-'0';
}
if(G(sum))
printf("Yes\n");
else printf("No\n");
}
}