#include using namespace std; using ll = long long; using pii = pair; using arr = array; const ll mod = 1e9 + 9; void Tsukikage() { string M, D; cin >> M >> D; vector ans1(2010), ans2(2010); vector memo(210, vector(2, vector(2010, -1))); auto dfs = [&](auto dfs, string &s, int idx, bool limit, int sums) -> ll { if (sums < 0) return 0; if (idx == s.size()) { return sums == 0 ? 1 : 0; } if (memo[idx][limit][sums] != -1) { return memo[idx][limit][sums]; } int up = limit ? s[idx] - '0' : 9; ll res = 0; for (int i = 0; i <= up; i++) { res += dfs(dfs, s, idx + 1, limit and (i == up), sums - i); res %= mod; } return memo[idx][limit][sums] = res; }; for (int i = 1; i < 2010; i++) { ans1[i] += dfs(dfs, M, 0, 1, i); ans1[i] %= mod; } fill(memo.begin(), memo.end(), vector(2, vector(2010, -1))); for (int i = 1; i < 2010; i++) { ans2[i] += dfs(dfs, D, 0, 1, i); ans2[i] %= mod; } // dfs(dfs, D, ans2, 0, true, 0); // for (int d = 0; d <= 1; d++) { // for (int i = 1; i < D.size(); i++) { // ans2[i] += memo[D.size()][d][i]; // ans2[i] %= mod; // } // } ll ans = 0; for (int i = 1; i < 2010; i++) { ans += ans1[i] * ans2[i] % mod; ans %= mod; } cout << ans; } signed main() { ios::sync_with_stdio(false); cin.tie(0); // int _; // for (cin >> _; _; _--) Tsukikage(); return 0; } // #include // using namespace std; // using ll = long long; // using pii = pair; // using arr = array; // const ll mod = 1e9 + 9; // void Tsukikage() { // string M, D; // cin >> M >> D; // vector ans1(M.size() * 10 + 30), ans2(D.size() * 10 + 30); // vector memo(210, vector(2, vector(2010, -1))); // auto dfs = [&](auto dfs, string &s, int idx, bool limit, int sums) -> ll { // if (idx == s.size()) { // return 1; // } // if (memo[idx][limit][sums] != -1) { // return memo[idx][limit][sums]; // } // int up = limit ? s[idx] - '0' : 9; // ll res = 0; // for (int i = 0; i <= up; i++) { // res += dfs(dfs, s, idx + 1, limit and (i == up), sums + i); // res %= mod; // } // return memo[idx][limit][sums] = res; // }; // for (int i = 1; i < M.size(); i++) { // ans1[i] += dfs(dfs, M, 0, 1, 0); // ans1[i] %= mod; // } // fill(memo.begin(), memo.end(), vector(2, vector(2010, -1))); // for (int i = 1; i < D.size(); i++) { // ans2[i] += dfs(dfs, D, 0, 1, 0); // ans2[i] %= mod; // } // // dfs(dfs, D, ans2, 0, true, 0); // // for (int d = 0; d <= 1; d++) { // // for (int i = 1; i < D.size(); i++) { // // ans2[i] += memo[D.size()][d][i]; // // ans2[i] %= mod; // // } // // } // ll ans = 0; // for (int i = 1; i < min(ans1.size(), ans2.size()); i++) { // ans += ans1[i] * ans2[i] % mod; // ans %= mod; // } // cout << ans; // } // signed main() { // ios::sync_with_stdio(false); // cin.tie(0); // // int _; // // for (cin >> _; _; _--) // Tsukikage(); // return 0; // }