代码很好理解的:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,r,dp[15][15][15][2][2][2];
vector<int> v;
int dfs(int w,int a,int b,bool flag,bool ok,bool c){
if(w==v.size()) return ok;
if(dp[w][a][b][flag][ok][c]!=-1) return dp[w][a][b][flag][ok][c];
int ans=0;
for(int i=0;i<=(flag?v[w]:9);i++){
if(i==4||i==8) continue;
if(c&&!i) ans+=dfs(w+1,i,a,flag&&i==v[w],0,1);
else ans+=dfs(w+1,i,a,flag&&i==v[w],ok||a==i&&b==i,0);
}
return dp[w][a][b][flag][ok][c]=ans;
}
int f(int n){
memset(dp,-1,sizeof(dp));
v.clear();
while(n){
v.push_back(n%10);
n/=10;
}
reverse(v.begin(),v.end());
return dfs(0,11,11,1,0,1);
}
signed main(){
scanf("%lld%lld",&l,&r);
printf("%lld",f(r)-f(l-1));
return 0;
}