杭电2089----不要62

 1 //数位dp入门
 2 #include<cstdio>
 3 int a[8],d[8][3];
 4 
 5 void init()
 6 {
 7     d[0][0] = 1;
 8     for(int i=1; i<7; ++i)
 9     {
10         d[i][0] = d[i-1][0]*9 - d[i-1][1];              //当前位全部吉利数个数
11         d[i][1] = d[i-1][0];                            //当前位为2的全部吉利数的个数
12         d[i][2] = d[i-1][2]*10 + d[i-1][0] + d[i-1][1]; //当前位全部不吉利数个数
13     }
14 }
15 
16 int solven(int x)                                       //求小于x的吉利数个数
17 {
18     int t = x,pos = 0;
19     while(x != 0)
20     {
21         a[++pos] = x%10;
22         x /= 10;
23     }
24     a[pos+1] = 0;                                       //防止数据之间的影响
25     int flag = 0,ans = 0;
26     for(int i=pos; i>0; --i)                            //求0-x之间不吉利数个数
27     {
28         ans += d[i-1][2]*a[i];
29         if(flag != 0)
30             ans += d[i-1][0]*a[i];
31         else
32         {
33             if(a[i] > 4)                                //高位可能为4
34                 ans += d[i-1][0];
35             if(a[i] > 6 || (a[i] == 6 && a[i-1] > 2))   //高位出现62
36                 ans += d[i-1][1];
37             if(a[i] == 4 || (a[i+1] == 6 && a[i] == 2)) //前面已经出现了62或者4
38                 flag = 1;
39         }
40     }
41     return t-ans;
42 }
43 
44 int main()
45 {
46     init();
47     int n,m;
48     while(~scanf("%d%d",&n,&m) && n+m != 0)
49         printf("%d\n",solven(m+1) - solven(n));
50     return 0;
51 }

 

posted @ 2017-05-06 15:29  Posase  阅读(232)  评论(0编辑  收藏  举报