module main; // https://kmjp.hatenablog.jp/entry/2015/04/22/0900 より // 桁DP import std; immutable MOD = 10L ^^ 9 + 9; // 各桁の和がそれぞれ何通りあるかを数え上げる long[int] enumDigitSum(char[] S) { immutable mDig = 200; static long[mDig * 10 + 50][mDig + 5] dp; int total = 0; typeof(return) R; if (dp[0][0] == 0) { dp[0][0] = 1; foreach (i; 0 .. mDig + 2) foreach (y; 0 .. mDig * 10 + 2) foreach (x; 0 .. 10) (dp[i + 1][y + x] += dp[i][y]) %= MOD; } S.reverse; while (!S.empty) { int x = S[$ - 1] - '0'; foreach (i; 0 .. x) foreach (y; 0 .. mDig * 10 + 2) if (dp[S.length - 1][y]) (R[y + total + i] += dp[S.length - 1][y]) %= MOD; total += x; S.popBack; } R[total]++; return R; } void main() { // 入力 char[] M, D; readln.chomp.formattedRead("%s %s", M, D); // 答えの計算 auto MM = enumDigitSum(M), DD = enumDigitSum(D); long ret = 0; foreach (e; MM.byKeyValue) if (e.key) { ret += e.value * DD.get(e.key, 0) % MOD; } // 答えの出力 writeln(ret % MOD); }