#include using namespace std; typedef long long signed int LL; typedef long long unsigned int LU; #define incID(i, l, r) for(int i = (l) ; i < (r); i++) #define incII(i, l, r) for(int i = (l) ; i <= (r); i++) #define decID(i, l, r) for(int i = (r) - 1; i >= (l); i--) #define decII(i, l, r) for(int i = (r) ; i >= (l); i--) #define inc(i, n) incID(i, 0, n) #define inc1(i, n) incII(i, 1, n) #define dec(i, n) decID(i, 0, n) #define dec1(i, n) decII(i, 1, n) #define inII(v, l, r) ((l) <= (v) && (v) <= (r)) #define inID(v, l, r) ((l) <= (v) && (v) < (r)) #define PB push_back #define EB emplace_back #define MP make_pair #define FI first #define SE second #define UB upper_bound #define LB lower_bound #define PQ priority_queue #define ALL(v) v.begin(), v.end() #define RALL(v) v.rbegin(), v.rend() #define FOR(it, v) for(auto it = v.begin(); it != v.end(); ++it) #define RFOR(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it) template bool setmin(T & a, T b) { if(b < a) { a = b; return true; } else { return false; } } template bool setmax(T & a, T b) { if(b > a) { a = b; return true; } else { return false; } } template bool setmineq(T & a, T b) { if(b <= a) { a = b; return true; } else { return false; } } template bool setmaxeq(T & a, T b) { if(b >= a) { a = b; return true; } else { return false; } } template T gcd(T a, T b) { return (b == 0 ? a : gcd(b, a % b)); } template T lcm(T a, T b) { return a / gcd(a, b) * b; } // ---- ---- string a, b; LL dp[2][2 + 1][2][3][8], MOD = 1e9 + 7; void init(int i) { inc(j, 2) { inc(k, 2) { inc(l, 3) { inc(m, 8) { dp[i][j][k][l][m] = 0; } } } } } LL f(string s) { init(0); dp[0][1][0][0][0] = 1; inc(i, s.size()) { init((i + 1) % 2); inc(j, 2) { inc(k, 2) { inc(l, 3) { inc(m, 8) { inc(n, 10) { int v = s[i] - '0'; int ii = (i + 1) % 2; int jj = (j == 0 ? 0 : (v == n ? 1 : (n < v ? 0 : 2))); int kk = (k ? 1 : (n == 3)); int ll = (l * 10 + n) % 3; int mm = (m * 10 + n) % 8; (dp[ii][jj][kk][ll][mm] += dp[i % 2][j][k][l][m]) %= MOD; } } } } } } LL ans = 0; inc(j, 2) { inc(k, 2) { inc(l, 3) { inc(m, 8) { if((k || l == 0) && m != 0) { (ans += dp[s.size() % 2][j][k][l][m]) %= MOD; } } } } } return ans; } /* LL g(string s) { int v = 0; inc(i, s.size()) { v = v * 10 + s[i] - '0'; } LL ans = 0; inc1(i, v) { int j = i, sum = 0; while(j) { sum += (j % 10 == 3); j /= 10; } if((sum || i % 3 == 0) && i % 8 != 0) { ans++; } } return ans; } */ int main() { /* cin >> a; cout << "f: " << f(a) << endl; cout << "g: " << g(a) << endl; */ cin >> a >> b; dec(i, a.size()) { a[i]--; if(inII(a[i], '0', '9')) { break; } else { a[i] = '9'; } } cout << (f(b) + MOD - f(a)) % MOD << endl; return 0; }