调了快两三天了 好像没有任何问题但是样例都过不了
#include <bits/stdc++.h>
#define int long long
using namespace std;
int l, r;
int f[13][11][3][5][4][3]; //f[i][k][lim][leng][4/8][zero]
int solve(int x) {
//if (x == 9999999999) return 0;
memset(f, 0, sizeof(f));
int num[20];
int len = 0;
while (x) {
num[++len] = x % 10;
x /= 10;
}
for (int i = 1; i <= (len >> 1); ++i) swap(num[i], num[len - i + 1]);
f[0][0][1][0][0][1] = 1;
for (int i = 1; i <= len; ++i)
for (int j = 0; j <= 9; ++j)
for (int leng = 0; leng <= 3; ++leng)
for (int lim2 = 0; lim2 <= 2; ++lim2)
for (int lim = 0; lim <= 1; ++lim)
for (int zero = 0; zero <= 1; ++zero)
for (int k = 0; k <= 9; ++k) {
if ((k == 4 && lim2 == 2) || (k == 8 && lim2 == 1) || (j + k == 12 && abs(j - k) == 4)) continue;
//if ((j == 4 && lim2 != 1) || (j == 8 && lim2 != 2)) break;
if (lim && k > num[i]) break;
if (zero && j != 0) break;
int t = 0;
if (k == 4) t = 1;
else if (k == 8) t = 2;
int _z = (zero && (k == 0));
int leng_;
if (leng == 3) leng_ = 3;
else leng_ = ((k == j) ? (leng + 1) : 1);
//cout << (lim && k == num[i]);
f[i][k][lim && k == num[i]][leng_][t][_z] += f[i - 1][j][lim][leng][lim2][zero];
}
int res = 0;
for (int j = 0; j <= 9; ++j)
for (int lim = 0; lim <= 1; ++lim)
for (int lim2 = 0; lim2 <= 2; ++lim2) {
res += f[len][j][lim][3][lim2][0];
//if (f[len][j][lim][3][lim2][0]) printf("j=%lld,lim2=%lld,lim=%lld,cnt=%lld\n", j, lim2, lim, f[len][j][lim][3][lim2][0]);
}
//cout << res << endl;
return res;
}
signed main() {
cin >> l >> r;
cout << solve(r) - solve(l - 1) << endl;
return 0;
}