#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[12][11][11][11][2][2][2][2];
int m[12];
ll dfs(int p, int a, int b, int d, int c, int _4, int _8, int _3) {
/*
p:当前处理第p位数
a:当前第p位数的值
b:当前第p+1位数的值
d:当前第p+2位数的值
c:之前是否已经保证x<n
_4:是否出现过4
_8:是否出现过8
_3:是否出现过连续三位数
*/
if (_4 && _8)
return 0;
if (p <= 1)
return _3;//
if (dp[p][a][b][d][c][_4][_8][_3] != -1)
return dp[p][a][b][d][c][_4][_8][_3];
int up = !c ? m[p] : 9;
ll ans = 0;
for (int i = 0; i <= up; i++) {
ans += dfs(p - 1, i, a, b, c || (i < up), _4 || i == 4, _8 || i == 8, _3 || (i == a && a == b));
}
dp[p][a][b][d][c][_4][_8][_3] = ans;
return ans;
}
ll solve(ll n) {
if (n < 1e10)
return 0;
int len;
memset(dp, -1, sizeof(dp));
for (len = 0; n; n /= 10) {
m[++len] = n % 10;
}
ll ans = 0;
for (int i = 1; i <= m[len]; i++) {
//当前处理第11位,
//第11位值为i,
//第11+1位值为-1,
//第11+2位值为-1,
//当前位是否受上界约束,
//是否出现4,
//是否出现8,
//是否有连续3个相同数
ans += dfs(11, i, -1, -1, i < m[len], i == 4, i == 8, 0);
}
return ans;
}
int main() {
ll l, r;
cin >> l >> r;
//l = 12121284000, r = 12121285550;
cout << solve(r) - solve(l - 1) << endl;
return 0;
}
一晚上也没看出来哪错了QAQ