#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod = 1000000007;
long long f[10030][2][10][10][2];
int n = 0, c[10030];
long long calc(long long x) {
// int n = 0;
// int c[30] {};
// while (x) {
// c[++ n] = x % 10;
// x /= 10;
// }
// 初始化
// f[i][j][k][l][h]
memset (f, 0, sizeof f);
// long long f[30][2][10][10][2] {};
for (int i = n; i; i --)
for (int j = 1; j <= ((i == n) ? c[n] : 9); j ++)
for (int k = 0; k <= ((i == n && j == c[n]) ? c[n - 1] : 9); k ++)
f[i - 1][i == n && j == c[n] && k == c[n - 1]][j][k][j == k] = 1;
// 状态转移
for (int i = n + 1; i >= 2; i --)
for (int j = 0; j < 2; j ++)
for (int k = 0; k < 10; k ++)
for (int l = 0; l < 10; l ++)
for (int h = 0; h < 2; h ++) {
int up = j ? c[i - 1] : 9;
for (int q = 0; q <= up; q ++)
if (q == l || q == k || h)
(f[i - 1][j && q == up][l][q][1] += f[i][j][k][l][h]) %= 1000000007;
else
(f[i - 1][j && q == up][l][q][0] += f[i][j][k][l][h]) %= 1000000007;
}
long long res = 0;
for (int i = 0; i <= 9; i ++)
for (int j = 0; j <= 9; j ++)
(res += (f[1][0][i][j][1] + f[1][1][i][j][1])) %= 1000000007;
return res;
}
signed main() {
string L, R;
cin >> L >> R;
long long l = 0, r = 0;
int flag = 0;
for (int i = (int) L.size() - 1; i >= 0; i --)
if (i && L[i] == L[i - 1] || i > 1 && L[i] == L[i - 2]) {
flag = 1;
break;
}
for (int i = (int) R.size() - 1, j = 1; i >= 0; i --, j ++) c[j] = (R[i] ^ '0'), n ++;
for (int i = 0; i < (int) L.size(); i ++) (l = (l << 1LL) + (l << 3LL) + (L[i] ^ '0')) %= mod;
for (int i = 0; i < (int) R.size(); i ++) (r = (r << 1LL) + (r << 3LL) + (R[i] ^ '0')) %= mod;
long long ansa = calc(r);
n = 0;
for (int i = (int) L.size() - 1, j = 1; i >= 0; i --, j ++) c[j] = (L[i] ^ '0'), n ++;
// c[1] --;
// int kk = 1;
// while (c[kk] < 0) {
// c[kk] += 10;
// c[++ kk] --;
// }
long long ansb = calc(l - 1);
cout << ((ansa - ansb + flag) % mod + mod) % mod << '\n';
return 0;
}
10-08
204
07-25
167