/*
reference:
Date:
2019.10.08
sol:
*/
using namespace std;
template
int l,r,len;
int dp[10][10];
int bit[10];
inline int dfs(int pos,int pre,int limit){
if(pos>len)return 1;
if(dp[pos][pre]!=-1 && !limit)return dp[pos][pre];
int up=limit?bit[len-pos+1]:9;
int res=0;
rep(i,0,up){
if(i==4)continue;
if(pre==6 && i==2)continue;
res+=dfs(pos+1,i,i==up && limit);
}
if(!limit)dp[pos][pre]=res;
return res;
}
inline int work(int x){
mem(dp,-1);
len=0;
while(x){
bit[++len]=x%10;
x/=10;
}
return dfs(1,0,1);
}
int main(){
#ifdef WIN32
freopen("test.txt","r",stdin);
#endif
while(1){
rd(l),rd(r);
if(l==0 && r==0)break;
printf("%lld\n",work(r)-work(l-1));
}
return 0;
}
原文:https://www.cnblogs.com/sjsjsj-minus-Si/p/11637669.html