题目大意:给出最长为6的数字串,1.把任意一个数变为比它小的数;2.删除一个0和它右边的所有数字;
sg[ ]打表,若一次操作能将状态转移为sg值为0, 即sg值为1;
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define LL long long
#define MAX 0x3f3f3f3f
#define N (1000000 + 5)
using namespace std;
int sg[N], vis[N];
// int add[8] = {1, 10, 100, 1000, 10000, 100000};
void dfs(int n)
{
if (sg[n] != -1)
{
return;
}
else
{
int tmp;
for (int i = 1; i <= n; i *= 10)
{
if (n / i % 10)
{
tmp = n;
do
{
tmp -= i;
if (tmp < i)
{
break;
}
if (!sg[tmp])
{
sg[n] = 1;
return ;
}
}while (tmp / i % 10);
}
else if (!sg[n / i / 10])
{
sg[n] = 1;
return;
}
}
}
sg[n] = 0;
}
int main()
{
char str[10];
memset(sg, -1, sizeof(sg));
sg[0] = 1;
for (int i = 1; i < N; i++)
{
dfs(i);
}
while (~scanf("%s", str))
{
if (str[0] == '0')
{
printf("Yes\n");
}
else
{
int sum = 0;
int len = strlen(str);
for (int i = 0; i < len; i++)
{
sum *= 10;
sum += str[i] - '0';
}
if (sg[sum] == 0)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
}
}