思路
数位dp模板题。从高位往低位进行搜索,用pos记录当前位置,lst记录上个位置的数字,bz记录上个位置是否是6,limit来记录上个位置是否达到了上界(如果达到了,就需要对当前位置的上界进行处理)
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int f[20][2];
int a[20];
int dfs(int pos,int lst,int bz,int limit) {
if(pos==0) return 1;
if(f[pos][bz]!=-1) return f[pos][bz];
int up=limit?a[pos]:9;
int ans=0;
for(int i=up;i>=0;--i) {
if(i==4||(lst==6&&i==2)) continue;
ans+=dfs(pos-1,i,i==6,limit&&i==up);
}
if(!limit) f[pos][bz]=ans;
return ans;
}
int solve(int x) {
memset(a,0,sizeof(a));
memset(f,-1,sizeof(f));
while(x){
a[++a[0]]=x%10;
x/=10;
}
return dfs(a[0],0,0,1);
}
int main() {
int l,r;
while(1) {
l=read();
r=read();
if(!l&&!r) break;
printf("%d\n",solve(r)-solve(l-1));
}
return 0;
}