#include #include #include #include #include #include using namespace std; struct DigitDP { using Func=function; vector funcs; vector ubs; size_t size, n; int64_t mod; vector dp; DigitDP(int64_t mod): size(2), mod(mod) {} void add_func(size_t ub, const Func &&func) { size *= ub; ubs.push_back(ub); funcs.push_back(func); } void store(const string &number) { n = number.length(); dp.assign(size*(n+1), 0); dp[0]=1; vector indices(funcs.size()); for (size_t pos=0; pos pair get(Index... k) { size_t li=(n<<1), ei=(n<<1|1); li = get_index(0, li, k...); ei = get_index(0, ei, k...); pair res(dp[ei], dp[li]); (res.second += res.first) %= mod; return res; } template size_t get_index(size_t i, size_t index, First first, Rest... rest) { return get_index(i+1, index*ubs[i]+first, rest...); } size_t get_index(size_t i, size_t index) { return index; } void dfs( const string &number, size_t pos, size_t less, vector &dp, vector &indices, size_t index=0 ) { if (index == funcs.size()) { // update dp table size_t ub=less? 9:(number[pos]-'0'); for (size_t d=0; d<=ub; ++d) { size_t next=pos+1, prev=pos; (next <<= 1) |= (less || d < ub); (prev <<= 1) |= less; for (size_t i=0; i count(const string &number) { DigitDP d(1e9+7); d.add_func(2, [](size_t k, size_t d)->size_t { return k || d == 3; }); d.add_func(3, [](size_t l, size_t d)->size_t { return (l + d) % 3; }); d.add_func(8, [](size_t m, size_t d)->size_t { return (m * 10 + d) % 8; }); d.store(number); pair res; for (size_t k=0; k<2; ++k) for (size_t l=0; l<3; ++l) for (size_t m=0; m<8; ++m) if ((k || l == 0) && m != 0) { pair tmp=d.get(k, l, m); res.first += tmp.first; res.second += tmp.second; } return res; } int main() { string A, B; { char tmp[16384]; scanf("%s", tmp); A = tmp; scanf("%s", tmp); B = tmp; } printf("%lld\n", count(B).second-count(A).first); return 0; }