来源:HDU1404
博弈论,sg基础题,关键是要知道后继是什么
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int MAXN = 10000010;//一开始开不下,换成bool过的
char s[10];
bool sg[MAXN];
int ans;
int shu[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
inline void data(int len){
ans = 0;
for(int i=0;i<len;i++)
{
ans = ans*10+s[i]-'0';
}
}
int getlen(int d){
int cnt = 0;
while(d) {
cnt++;
d/=10;
}
return cnt;
}
void getsg(int tt){
int cnt = getlen(tt);
for(int i=1;i<=cnt;i++){
int dl = cnt-i;
int power = shu[dl];
int now = tt/power;
now = now%10;
for(int i=now+1;i<=9;i++){
sg[tt+(i-now)*power] = 1;
}
}
if(cnt == 6) return ;
int ll = cnt;
int power = 1;
int t = tt;
while(ll<6){
t *= 10;
for(int i=0;i<power;i++){
sg[t+i] = 1;
}
power *= 10;
ll++;
}
return ;
}
void solve(){
memset(sg,0,sizeof(sg));
sg[0] = 1;
for(int i=1;i<=1000000;i++){
if(sg[i]==0) {
getsg(i);
}
}
}
int main(){
solve();
while(scanf("%s",s)!=EOF){
int len = strlen(s);
data(len);
if(s[0] == '0') {
puts("Yes");
continue;
}
if(sg[ans]) puts("Yes");
else puts("No");
}
return 0;
}