用了 lead 判断是否存在前导零,lead=1 表示有前导零,flag 是有没有到达上限。
#include<bits/stdc++.h>
using namespace std;
int a[25];
long long f[15][10][10][2][2][2];
long long dfs(int step,bool flag,bool lead,int l1,int l2,bool f8,bool f4,bool con){
if(f8&&f4) return 0;
if(step<1) return con;
if(!flag&&!lead&&f[step][l1][l2][f8][f4][con]!=-1) return f[step][l1][l2][f8][f4][con];
long long cnt=0;
int up=flag?a[step]:9;
for(int i=0;i<=up;i++){
if(f8&&i==4) continue;
if(f4&&i==8) continue;
cnt+=dfs(step-1,flag&&(i==up),lead&&(i==0),i,l1,f8||(i==8),f4||(i==4),con||(!lead&&i==l1&&i==l2));
}
if(!flag&&!lead) f[step][l1][l2][f8][f4][con]=cnt;
return cnt;
}
long long solve(long long x){
memset(f,-1,sizeof(f));
int sz=0;
while(x){
a[++sz]=x%10;
x/=10;
}
if(sz!=11) return 0;
return dfs(sz,1,1,0,0,0,0,0);
}
int main(){
long long x,y;
scanf("%lld %lld",&x,&y);
printf("%lld",solve(y)-solve(x-1));
return 0;
}