标签:
首先如果第一个数字是0的话,那么先手必胜。
对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态。
比如1是必败状态,那么2~9可以转移到1,所以是必胜状态。
10,10*,10**,10***,10****也都可以删除1后面那个0,转移到1,所以也是必胜状态。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 const int maxn = 999999; 6 int sg[maxn + 10]; 7 8 void init() 9 { 10 char s[10], s1[10]; 11 for(int i = 1, j; i <= maxn; i++) if(!sg[i])//先手必败点 12 {//所有能转移到先手必败的状态都是先手必胜状态 13 sprintf(s, "%d", i); 14 int n = strlen(s); 15 for(j = 0; j < n; j++) 16 {//每一位都加上1 17 strcpy(s1, s); 18 while(++s1[j] <= ‘9‘) sg[atoi(s1)] = 1; 19 } 20 int m = i, b = 1; 21 for(int j = n; j < 6; j++) 22 {//在后面添0 23 m *= 10; 24 for(int k = 0; k < b; k++) sg[m + k] = 1; 25 b *= 10; 26 } 27 } 28 } 29 30 int main() 31 { 32 init(); 33 char s[10]; 34 while(scanf("%s", s) == 1) 35 { 36 if(s[0] == ‘0‘) { puts("Yes"); continue; } 37 int n = 0, l = strlen(s); 38 for(int i = 0; i < l; i++) n = n * 10 + s[i] - ‘0‘; 39 printf("%s\n", sg[n] ? "Yes" : "No"); 40 } 41 42 return 0; 43 }
HDU 1404 (博弈) Digital Deletions
标签:
原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4414366.html