#include #include #include #include #include #include #include #include #include #include static const int MOD = 1000000009; using ll = long long; using u32 = uint32_t; using namespace std; template constexpr T INF = ::numeric_limits::max() / 32 * 15 + 208; template vector make_v(U size, const T& init){ return vector(static_cast(size), init); } template auto make_v(U size, Ts... rest) { return vector(static_cast(size), make_v(rest...)); } template void chmin(T &a, const T &b){ a = (a < b ? a : b); } template void chmax(T &a, const T &b){ a = (a > b ? a : b); } template struct modint { ll val; modint(const ll x = 0) : val(x) { val = x; while(val < 0) val += M; while(val > M) val -= M; } modint operator+(const modint a) const { return modint(*this) += a; } modint operator-(const modint a) const { return modint(*this) -= a; } modint operator*(const modint a) const { return modint(*this) *= a; } modint operator/(const modint a) const { return modint(*this) /= a; } modint operator-() const { return modint(M-val); } modint inv() const { ll u = 1, v = 0, s = 0, t = 1, m = M, x = val; while (x) {ll q = m/x; swap(s -= q*u, u); swap(t -= q*v, v); swap(m -= q*x, x); } if(s < 0) s += M; return modint(s); } modint pow(ll n) const { ll u = 1, xx = val; while (n > 0){ if (n&1) u = u * xx % M; xx = xx * xx % M; n >>= 1; } return modint(u); } modint& operator+=(const modint a){ val += a.val; if(val >= M) val -= M; return *this; } modint& operator-=(const modint a){ val -= a.val; if(val < 0) val += M; return *this; } modint& operator*=(const modint a){ val = val * a.val % M; return *this; } modint& operator/=(const modint a){ val = val * a.inv().val % M; return *this;} modint& operator=(const int& x){ val = x; while(val < 0) val += M; while(val > M) val -= M; return *this; } }; using mint = modint; int main() { string s, t; cin >> s >> t; int n = s.size(), m = t.size(); auto dp1 = make_v(n+1, 2, 9*n+1, mint(0)); auto dp2 = make_v(m+1, 2, 9*m+1, mint(0)); dp1[0][0][0] = 1; dp2[0][0][0] = 1; for (int i = 0; i < n; ++i) { for (int k = 0; k < 9*i+1; ++k) { for (int j = 0; j < 2; ++j) { int x = (j ? 9 : s[i]-'0'); for (int d = 0; d <= x; ++d) { dp1[i+1][j|(d < x)][k+d] += dp1[i][j][k]; } } } } dp1.back()[1][0] -= 1; for (int i = 0; i < m; ++i) { for (int k = 0; k < 9*i+1; ++k) { for (int j = 0; j < 2; ++j) { int x = (j ? 9 : t[i]-'0'); for (int d = 0; d <= x; ++d) { dp2[i+1][j|(d < x)][k+d] += dp2[i][j][k]; } } } } dp2.back()[1][0] -= 1; mint ans = 0; for (int i = 0; i < min(n,m)*9+1; ++i) { mint p = 0, q = 0; for (int j = 0; j < 2; ++j) { p += dp1.back()[j][i]; q += dp2.back()[j][i]; } ans += p*q; } cout << ans.val << "\n"; return 0; }