#include #include using namespace std; using i64 = long long; template class Range{private:struct I{T x;T operator*(){return x;}bool operator!=(I& lhs){return x; template struct Modint { static const Modint* none; // *modint::none long long x; Modint(void) { x = 0; }; Modint(long long a) { x = (a%mod+mod)%mod; }; Modint(string s) { x = 0; for(char c : s) { (x *= 10) += (c - '0'); x %= mod; } // if(!x) { x = mod; } }; static Modint* noneInstance(void) { Modint* res = new Modint(); res->x = -1; return res; } bool is_none(void) { return x == -1; } Modint operator + (const Modint a) { return Modint(*this) += a; } Modint operator - (const Modint a) { return Modint(*this) -= a; } Modint operator * (const Modint a) { return Modint(*this) *= a; } Modint operator * (const long long a) { return Modint(*this) *= (a%mod+mod)%mod; } friend Modint operator * (const long long a, const Modint& b) { return Modint(b) *= (a%mod+mod)%mod; } Modint operator +=(const Modint& a) { if((x+=a.x)>=mod) { x-=mod; } return *this; } Modint operator -=(const Modint& a) { if((x-=a.x)<0) { x+=mod; } return *this; } Modint operator *=(const Modint& a) { (x*=a.x)%=mod; return *this; } Modint operator *=(const long long a) { (x*=(a%mod+mod)%mod)%=mod; return *this; } /* a++ */ Modint operator ++(int) { Modint old; old.x = x; if((x+=1)>=mod) { x-=mod; }; return old; } /* ++a */ Modint operator ++(void) { *this += 1; return *this; } /* a-- */ Modint operator --(int) { Modint old; old.x = x; if((x-=1)<0) { x+=mod; }; return old; } /* --a */ Modint operator --(void) { *this -= 1; return *this; } bool operator ==(const Modint& a) const { return x == a.x; } bool operator ==(const long long a) const { return x == (a%mod+mod)%mod; } bool operator !=(const Modint& a) const { return !(x == a.x); } bool operator !=(const long long a) const { return x != (a%mod+mod)%mod; } int intvalue(void) const { return (int)x; } Modint pow(const long long n){ Modint res = 1; long long p = x; for(long long i=n; i>0; i>>=1) { if(i & 1) { res *= p; } (p *= p) %= mod; } return res; } }; template const Modint* Modint::none = Modint::noneInstance(); const int mod = 1000000007; using modint = Modint; modint f(string s) { int n = s.size(); vector>>>> dp(n+1, vector>>>(2, vector>>(2, vector>(3, vector(8))))); dp[0][0][0][0][0] = 1; for(auto i : range(n)) { for(auto j : range(2)) { for(auto has3 : range(2)) { for(auto k0 : range(24)) { for(auto d : range(j?10:s[i]-'0'+1)) { int flag = j || d < s[i] - '0', nhas3 = has3 || (d==3), k1 = k0 * 10 + d; dp[i+1][flag][nhas3][k1%3][k1%8] += dp[i][j][has3][k0%3][k0%8]; } } } } } modint res = 0; for(auto j : range(2)) { for(auto k8 : range(1, 8)) { for(auto k3 : range(3)) { res += dp[n][j][1][k3][k8]; } res += dp[n][j][0][0][k8]; } } return --res; } void minus1(string &s) { int n = s.size(); for(int i=n-1; i>=0; i--) { if(s[i] == '0') { s[i] = '9'; } else { s[i] -= 1; break; } } } int main(void) { string a, b; cin >> a >> b; minus1(a); modint res = f(b) - f(a); printf("%d\n", res.intvalue()); return 0; }