hdu 1404 找sg ***

HDU 1404  Digital Deletions

一串由0~9组成的数字,可以进行两个操作:1、把其中一个数变为比它小的数;2、把其中一个数字0及其右边的所以数字删除。

两人轮流进行操作,最后把所以数字删除的人获胜,问前者胜还是后者胜。

字符串长度为1-6,前者胜输出Yes,否则输出No.

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=1000000;
16 int m,tt;
17 bool sg[MAXN];
18 void fun(int n)
19 {
20     int i,j,k;
21     char ss[10];
22     sprintf(ss,"%d",n);
23     int len=strlen(ss);
24     for(i=0;i<len;i++)  //在每位上添加数字
25     {
26         int temp=n;
27         char tss[10];
28         strcpy(tss,ss);
29         while(tss[i]<'9')
30         {
31             tss[i]+=1;
32             sscanf(tss,"%d",&temp);
33             sg[temp]=1;
34         }
35     }
36     if(len!=6)
37     {
38         int temp=n;
39         int base=1;
40         for(i=len;i<6;i++)
41         {
42             temp*=10;
43             for(j=0;j<base;j++)
44             {
45                 sg[temp+j]=1;
46             }
47             base*=10;
48         }
49     }
50 }
51 void init()
52 {
53     sg[0]=1;
54     for(int i=1;i<MAXN;i++)
55     {
56         if(!sg[i])
57         {
58             fun(i);
59         }
60     }
61 }
62 int main()
63 {
64     int i,j,k,ca=1;
65     #ifndef ONLINE_JUDGE
66     freopen("1.in","r",stdin);
67     #endif
68     cl(sg);
69     init();
70     char s[10];
71     while(scanf("%s",s)!=EOF)
72     {
73         int n=0;
74         if(s[0]=='0')
75         {
76             printf("Yes\n");
77             continue;
78         }
79         int len=strlen(s);
80         for(i=0;i<len;i++)
81         {
82             n*=10;
83             n+=s[i]-'0';
84         }
85         if(sg[n])   printf("Yes\n");
86         else printf("No\n");
87     }
88 }

 

posted @ 2015-09-03 16:28  miao_a_miao  阅读(106)  评论(0编辑  收藏  举报