#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
long long f[705][705][2][2], digit[705], num, ans;
long long quick_pow(long long a, long long x) {
  long long ans = 1;
  while (x) {
    if (x & 1) ans = ans * a % MOD;
    a = a * a % MOD;
    x >>= 1;
  }
  return ans;
}
void dp(int x) {
  memset(f, 0, sizeof(f));
  f[0][0][0][1] = 1;
  for (int i = 0; i <= num; i++) {
    for (int j = 0; j <= i; j++) {
      for (int k = 0; k < 10; k++) {
        if (k > digit[i + 1]) {
          if (k > x) {
            f[i + 1][j + 1][0][0] += f[i][j][0][0];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
          } else if (k == x) {
            f[i + 1][j][1][0] += f[i][j][0][0];
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
          } else {
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j][1][0] += f[i][j][1][0];
          }
        } else if (k == digit[i + 1]) {
          if (k > x) {
            f[i + 1][j + 1][0][0] += f[i][j][0][0];
            f[i + 1][j + 1][0][1] += f[i][j][0][1];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
            f[i + 1][j + 1][1][1] += f[i][j][1][1];
          } else if (k == x) {
            f[i + 1][j][1][0] += f[i][j][0][0];
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j][1][1] += f[i][j][0][1];
            f[i + 1][j][0][1] += f[i][j][0][1];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
            f[i + 1][j + 1][1][1] += f[i][j][1][1];
          } else {
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j][0][1] += f[i][j][0][1];
            f[i + 1][j][1][0] += f[i][j][1][0];
            f[i + 1][j][1][1] += f[i][j][1][1];
          }
        } else {
          if (k > x) {
            f[i + 1][j + 1][0][0] += f[i][j][0][0];
            f[i + 1][j + 1][0][0] += f[i][j][0][1];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
            f[i + 1][j + 1][1][0] += f[i][j][1][1];
          } else if (k == x) {
            f[i + 1][j][1][0] += f[i][j][0][0];
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j][1][0] += f[i][j][0][1];
            f[i + 1][j][0][0] += f[i][j][0][1];
            f[i + 1][j + 1][1][0] += f[i][j][1][0];
            f[i + 1][j + 1][1][0] += f[i][j][1][1];
          } else {
            f[i + 1][j][0][0] += f[i][j][0][0];
            f[i + 1][j][0][0] += f[i][j][0][1];
            f[i + 1][j][1][0] += f[i][j][1][0];
            f[i + 1][j][1][0] += f[i][j][1][1];
          }
        }
        f[i + 1][j + 1][0][0] %= MOD;
        f[i + 1][j + 1][0][1] %= MOD;
        f[i + 1][j + 1][1][0] %= MOD;
        f[i + 1][j + 1][1][1] %= MOD;
        f[i + 1][j][0][0] %= MOD;
        f[i + 1][j][0][1] %= MOD;
        f[i + 1][j][1][0] %= MOD;
        f[i + 1][j][1][1] %= MOD;
      }
    }
  }
  for (int i = 0; i <= num; i++) {
    ans += (f[num][i][1][0] + f[num][i][1][1]) % MOD * quick_pow(10, i) % MOD *
           x % MOD;
    ans %= MOD;
  }
}
char s[1005];
void read() {
  scanf("%s", s);
  num = strlen(s);
  for (int i = 0; i < num; i++) digit[i + 1] = s[i] - '0';
}
int main() {
  read();
  for (int i = 1; i < 10; i++) dp(i);
  printf("%lld\n", ans);
  return 0;
}
