#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll mod = 1000000009; #define rep(i,n) for(int i=0;i=0;i--) #define all(x) (x).begin(),(x).end() const int SUM_MAX = 9 * 199; vector calc(string N) { //dp0[i][j] := 左からi桁目までを決めたとき、Nを超えないことが確定していて、かつ各桁の数字の合計値がjとなる数の個数 //dp1[i][j] := 左からi桁目までを決めたとき、Nを超えないことが確定しておらず、かつ各桁の数字の合計値がjとなる数の個数 //iは1始まり //jは最大 = 9*199(Nは最大200桁) vector> dp0(N.size() + 1, vector(SUM_MAX + 1, 0)); vector> dp1(N.size() + 1, vector(SUM_MAX + 1, 0)); dp1[0][0] = 1; rep(i, N.size()) { int d = N[i] - '0'; reple(j, 0, 9) { rep(k, SUM_MAX) { if (k + j > SUM_MAX) continue; dp0[i + 1][k + j] += dp0[i][k]; dp0[i + 1][k + j] %= mod; if (j < d) { dp0[i + 1][k + j] += dp1[i][k]; dp0[i + 1][k + j] %= mod; } else if (j == d) { dp1[i + 1][k + j] += dp1[i][k]; dp1[i + 1][k + j] %= mod; } } } } vector dp(SUM_MAX + 1, 0); rep(i, SUM_MAX) { dp[i] += (dp0[N.size()][i] + dp1[N.size()][i]) % mod; } return dp; } int main() { string M, D; cin >> M >> D; vector dpM = calc(M); vector dpD = calc(D); ll count = 0; //合計は1以上 repl(i, 1, SUM_MAX) { count += (dpM[i] * dpD[i]) % mod; count %= mod; } cout << count << endl; return 0; }