#include <bits/stdc++.h>
#pragma GCC optimize(3, "Ofast", "inline")
using namespace std;
inline long long read() {
  long long sum = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) sum = sum * 10 + (ch ^ 48), ch = getchar();
  return sum;
}
const long long mod = 1e9 + 7;
const long long mo = 998244353;
const long long M = 705;
inline long long min(long long x, long long y) {
  if (x < y) return x;
  return y;
}
inline long long max(long long x, long long y) {
  if (x > y) return x;
  return y;
}
char s[M];
long long n, m, a[M], f[M][M][10][2], ans;
inline void Add(long long &x, long long y) {
  x += y;
  if (x >= mod) x -= mod;
}
signed main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (register long long i = (1); i <= (n); i++) a[i] = s[i] ^ 48;
  for (register long long i = (0); i <= (9); i++) f[0][0][i][0] = 1;
  for (register long long i = (1); i <= (n); i++)
    for (register long long j = (0); j <= (i - 1); j++)
      for (register long long k = (1); k <= (9); k++)
        for (register long long p = (0); p <= (1); p++)
          for (long long l = 0; l <= ((p) ? 9ll : a[i]); l++)
            Add(f[i][j + (l >= k)][k][p | (l < a[i])], f[i - 1][j][k][p]);
  for (register long long i = (1); i <= (9); i++) {
    long long s = 1ll;
    for (register long long j = (1); j <= (n); j++)
      Add(ans, s * (f[n][j][i][0] + f[n][j][i][1]) % mod),
          s = (s * 10ll + 1ll) % mod;
  }
  printf("%lld\n", ans);
  return 0;
}
