#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++) using namespace atcoder; using namespace std; typedef long long ll; using mint = modint1000000007; mint dp[100010][3][8][2][2]; mint f(string s, bool eq) { int n = s.size(); rep(a, 0, n + 1) rep(b, 0, 3) rep(c, 0, 8) rep(d, 0, 2) rep(e, 0, 2) { dp[a][b][c][d][e] = 0; } dp[0][0][0][0][0] = 1; rep(i, 0, n) rep(d, 0, 10) rep(mod3, 0, 3) rep(mod8, 0, 8) rep(in3, 0, 2) rep(les, 0, 2) { if (les == 0 && d > (s[i] - '0')) continue; int nmod3 = (mod3 + d) % 3; int nin3 = in3 || (d == 3); int nles = les || (d < (s[i] - '0')); int p10 = n - 1 - i; int nmod8; if (p10 >= 3) { nmod8 = mod8; } else { nmod8 = (mod8 + pow_mod(10, p10, 8) * d) % 8; } dp[i + 1][nmod3][nmod8][nin3][nles] += dp[i][mod3][mod8][in3][les]; } mint ret = 0; rep(mod3, 0, 3) rep(mod8, 0, 8) rep(in3, 0, 2) { bool aho = mod3 == 0 || in3 == 1; bool blue = mod8 == 0; if (aho && !blue) { ret += dp[n][mod3][mod8][in3][1]; if (eq) ret += dp[n][mod3][mod8][in3][0]; } } return ret; } void solve() { string s, t; cin >> s >> t; mint ans = f(t, 1) - f(s, 0); cout << ans.val() << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }