#include <iostream> #include <cstring> #include <cstdio> #include <cassert> using namespace std; #define mod 1000000007 char s[100 + 10]; int dp[100 + 10][1 << 10][2], i, j, n, a[100 + 10], b[100 + 10], t, q, ans, bits[1 << 10], ki, k9, md, fl, ret, msk, af, bf, tmp, li, digits; void upd (int &a, int b) { a += b; if (a >= mod) a -= mod; } void precalculate () { for(i = 0; i < 110; i++) for(j = 0; j < 1024; j++) for(t = 0; t < 2; t++) dp[i][j][t] = 0; dp[0][0][1] = 1; for(i = 0; i < n; i++) for(j = 0; j < (1 << 10); j++) for(t = 0; t < 2; t++) if (dp[i][j][t]) { if (t == 0) { for(q = (j == 0); q < 10; q++) upd(dp[i + 1][j | (1 << q)][t], dp[i][j][t]); if (j == 0) upd(dp[i + 1][j][t], dp[i][j][t]); } if (t == 1) { if (j == 0) upd(dp[i + 1][j][a[i + 1] == 0], dp[i][j][t]); for(q = 0; q <= a[i + 1]; q++) if (j + q > 0) upd(dp[i + 1][j | (1 << q)][q == a[i + 1]], dp[i][j][t]); } } } int main (int argc, char * const argv[]) { // freopen("input.txt", "r", stdin); scanf("%s", &s); n = strlen(s); // validation goes here for(i = 0; i < n; i++) assert('0' <= s[i] && s[i] <= '9'); // only from digits assert('1' <= s[0] && s[0] <= '9'); // no leading zeroes assert(n <= 101); // <= 10^100 assert(n >= 1); // at least from one digit if (n == 101) { // can only be 10^100 assert(s[0] == '1'); for(i = 1; i < n; i++) assert(s[i] == '0'); } // validation ends here n += 3; for(i = 1; i < (1 << 10); i++) bits[i] = 1 + bits[i & (i - 1)]; for(i = 4; i <= n; i++) a[i] = s[i - 4] - '0'; if (n > 4) { ans = t = 0; for(i = 1; i <= n; i++) t = (t * 10LL + a[i]) % mod; t = (t - 9 + mod) % mod; ans = (1LL * t * (t + 1)) % mod; } ans = (ans * 5LL) % mod; for(ki = 1; ki < 10; ki++) { precalculate(); for(k9 = 0; k9 <= max(n - 3, 0); k9++) for(bf = 0; bf < 9; bf++) for (af = 0; af < 10; af++) { digits = (1 << af); if (k9) digits |= (1 << 9); for(li = 1; li < ki; li++) { if (af + li == 10) { digits |= (1 << (bf + 1)); if (k9) digits |= 1; } digits |= 1 << ((af + li) % 10); } int notbf = digits; digits |= (1 << bf); int digits2 = digits; b[0] = bf; for(j = 1; j <= k9; j++) b[j] = 9; b[k9 + 1] = af; fl = 0; for(j = 0; j <= k9 + 1; j++) if (a[n - (k9 + 2) + 1 + j] < b[j]) { fl = 1; break; } else if (a[n - (k9 + 2) + 1 + j] > b[j]) break; for(msk = 0; msk < (1 << 10); msk++) { if (msk == 0 && bf == 0) digits = notbf; tmp = 0; upd(tmp, dp[n - 2 - k9][msk][0]); if (!fl) upd(tmp, dp[n - 2 - k9][msk][1]); upd(ret, (tmp * 1LL * bits[msk | digits]) % mod); if (msk == 0 && bf == 0) digits = digits2; } } ret = (ret - ki + mod) % mod; // printf("%d\n", ret); --a[n]; if (a[n] == 0 && n == 4) break; t = n; while (a[t] < 0) { a[t] += 10; --t; --a[t]; } } printf("%d\n", (ret + ans) % mod); return 0; }