杭电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 }