View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 int dp[10][3]; 6 void getdp() 7 { 8 memset(dp,0,sizeof(dp)); 9 dp[0][0]=1; 10 for(int i=1;i<=6;i++) 11 { 12 dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; 13 dp[i][1]=dp[i-1][0]; 14 dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; 15 } 16 } 17 int f(int n) 18 { 19 int d[10],len=0; 20 for(int x=n;x;x/=10) d[len++]=x%10; 21 d[len]=0; 22 int ans=0; 23 bool flag=false; 24 for(int i=len-1;i>=0;i--) 25 { 26 ans+=dp[i][2]*d[i]; 27 if(flag) {ans+=dp[i][0]*d[i]; continue;} 28 if(d[i]>4) ans+=dp[i][0]; 29 if(d[i+1]==6 && d[i]>2) ans+=dp[i+1][1]; 30 if(d[i]>6) ans+=dp[i][1]; 31 if(d[i]==4 || (d[i+1]==6 && d[i]==2)) flag=true; 32 } 33 return n-ans; 34 } 35 int main() 36 { 37 getdp(); 38 int n,m; 39 while(scanf("%d%d",&n,&m),n||m) 40 { 41 int ans=f(m+1)-f(n); 42 printf("%d\n",ans); 43 } 44 return 0; 45 }