#include <bits/stdc++.h>
#define int long long
#define N 1000005
#define mkp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
int f[15][10][4][2][4],ans,a[15];//f[i][j][k=1/2/3][flag=0/1]表示到第i位为止末尾是j,连续的有k个(大于等于3时按3计算),前面所取的值是否完全等于所求上限(即后面选数字是否有限制)
void solve(int x,int Type){
memset(f,0,sizeof(f));
for(int i=11;i>=1;i--)a[i]=x%10,x/=10;
for(int i=1;i<a[1];i++)if(i!=4&&i!=8)f[1][i][1][0][0]=1;else f[1][i][1][0][i>>2]=1;
if(a[1]!=4&&a[1]!=8)f[1][a[1]][1][1][0]=1;else f[1][a[1]][1][0][a[1]>>2]=1;
for(int i=2;i<=11;i++){
for(int lst=0;lst<=9;lst++)
for(int l=1;l<=3;l++)
for(int j=0;j<=9;j++)
for(int k=0;k<=2;k++)
if(j!=4&&j!=8)f[i][j][l==3?3:(lst==j?l+1:1)][0][k]+=f[i-1][lst][l][0][k];
else f[i][j][l==3?3:(lst==j?l+1:1)][0][k|(j>>2)]+=f[i-1][lst][l][0][k];
for(int l=1;l<=3;l++)
for(int j=0;j<a[i];j++)
for(int k=0;k<=2;k++)
if(j!=4&&j!=8)f[i][j][l==3?3:(a[i-1]==j?l+1:1)][0][k]+=f[i-1][a[i-1]][l][1][k];
else f[i][j][l==3?3:(a[i-1]==j?l+1:1)][0][k|(j>>2)]+=f[i-1][a[i-1]][l][1][k];
for(int l=1;l<=3;l++)
for(int k=0;k<=2;k++)
if(a[i]!=4&&a[i]!=8)f[i][a[i]][l==3?3:(a[i-1]==a[i]?l+1:1)][1][k]+=f[i-1][a[i-1]][l][1][k];
else f[i][a[i]][l==3?3:(a[i-1]==a[i]?l+1:1)][1][k|(a[i]>>2)]+=f[i-1][a[i-1]][l][1][k];
}
for(int i=0;i<=9;i++)
for(int j=0;j<=2;j++)
ans+=f[11][i][3][0][j]*Type;
for(int j=0;j<=2;j++)
ans+=f[11][a[11]][3][1][j]*Type;
}
signed main() {
int x,y;scanf("%lld %lld",&x,&y);
solve(y,1);
if(x!=1e10)solve(x-1,-1);
printf("%lld\n",ans);
return 0;
}
错了第6个点,翻了翻讨论好像没有一样错的,谢谢大佬们qaq