#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;
}