#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int N = 705, mod = 1e9 + 7;
int n, dp[11][N][N][2];
char s[N];
inline void add(int &x, int y) {
  x = ((x + y) > mod) ? (x + y - mod) : (x + y);
}
int ten[N], ans;
inline void get_dp() {
  for (register int x = (1); x <= (9); ++x) {
    dp[x][0][0][1] = 1;
    for (register int i = (1); i <= (n); ++i) {
      for (register int j = (0); j <= (i); ++j) {
        for (register int k = (0); k <= (9); ++k) {
          if (j - (k >= x) < 0) break;
          if (k == s[i] - '0')
            add(dp[x][i][j][1], dp[x][i - 1][j - (k >= x)][1]);
          else if (k < s[i] - '0')
            add(dp[x][i][j][0], dp[x][i - 1][j - (k >= x)][1]);
          add(dp[x][i][j][0], dp[x][i - 1][j - (k >= x)][0]);
        }
      }
    }
    for (register int j = (1); j <= (n); ++j)
      add(ans, 1ll * ten[j - 1] * (dp[x][n][j][0] + dp[x][n][j][1]) % mod);
  }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  ten[0] = 1;
  for (register int i = (1); i <= (n); ++i)
    ten[i] = 1ll * ten[i - 1] * 10 % mod;
  for (register int i = (1); i <= (n); ++i) add(ten[i], ten[i - 1]);
  get_dp();
  printf("%d\n", ans);
  return 0;
}
