数位dp模板
代码(HDU2089)
#include<bits/stdc++.h>
using namespace std;
int dp[100][2],a[100],n,m;
int read(){
int f=1,re=0;char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int dfs(int pos,bool pre,bool limit,bool lead){
if(pos==-1) return 1;
if(!limit&&!lead&&dp[pos][pre]!=-1) return dp[pos][pre];
int up=limit?a[pos]:9,ans=0;
for(int i=0;i<=up;i++){
if(i==4) continue;
if(pre&&i==2) continue;
ans+=dfs(pos-1,i==6,limit&&(i==a[pos]),lead&&(i==0));
}if(!limit&&!lead) dp[pos][pre]=ans;
return ans;
}
int solve(int x){
int tot=0;
while(x){
a[tot++]=x%10;
x/=10;
}return dfs(tot-1,0,1);
}
int main(){
while(scanf("%d%d",&n,&m)&&n&&m){
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(m)-solve(n-1));
}return 0;
}