【题目分析】
数位DP
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[11][3];//0:吉利的数字 1:吉利的但是高位有2的数字 2:不吉利数字
void init()
{
dp[0][0]=1;
for (int i=1;i<=10;++i)
{
dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
dp[i][1]=dp[i-1][0];
dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];
}
}
inline int query(int x)
{
int num[11],top=0;
memset(num,0,sizeof num);
while (x)
{
num[++top]=x%10;
x/=10;
}
int flag=0,ans=0;
for (int i=top;i>=1;--i)
{
// cout<<num[i]<<" ";
if (!flag)
{
ans+=num[i]*dp[i-1][0];
if (num[i]>4) ans-=dp[i-1][0];
if (num[i]>6) ans-=dp[i-1][1];
if (num[i]>2&&num[i+1]==6) ans-=dp[i-1][0];
}
if (num[i]==4||(num[i]==2&&num[i+1]==6)) break;
// cout<<ans<<endl;
}
// cout<<ans<<endl;
return ans;
}
int main()
{
init();
int l,r;
// cout<<query(100)<<endl;
while(scanf("%d%d",&l,&r)!=EOF&&l&&r)
printf("%d\n",query(r+1)-query(l));
return 0;
}