P4124 数位DP打挂了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[21],l,r,dp[21][11][11][2][2][2];
int dfs(int pos,int pre1,int pre2,bool x,bool fr,bool _4,bool _8){
if(_4&&_8)return 0;
if(pos==0)return x;
if(!fr&&dp[pos][pre1][pre2][x][_4][_8]!=-1)return dp[pos][pre1][pre2][x][_4][_8];
int res=0,limit=fr?a[pos]:9;
for(int i=0;i<=limit;i++)
res+=dfs(pos-1,pre2,i,x||(pre2==i&&pre1==pre2),fr&&(i==limit),_4||(i==4),_8||(i==8));
if(!fr)dp[pos][pre1][pre2][x][_4][_8]=res;
return res;
}
int solve(int x){
int cnt=0;
while(x){
a[++cnt]=x%10;
x/=10;
}
if(cnt<11)return 0;
int res=0;
for(int i=1;i<=a[cnt];i++)
res+=(cnt-1,0,i,0,i==a[cnt],i==4,i==8);
return res;
}
signed main(){
memset(dp,-1,sizeof dp);
cin>>l>>r;
cout<<solve(r)-solve(l-1);
return 0;
}