#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T BM(T p, T e, T M) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return (T)ret;
}
template <class T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <class T>
inline T MDINV(T a, T M) {
  return BM(a, M - 2, M);
}
template <class T>
inline T PW(T p, T e) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p);
    p = (p * p);
  }
  return (T)ret;
}
template <class T>
string NTS(T Number) {
  stringstream ss;
  ss << Number;
  return ss.str();
}
template <class T>
T stringtonumber(const string &Text) {
  istringstream ss(Text);
  T result;
  return ss >> result ? result : 0;
}
string h;
long long int b;
long long int vis[13][2][13];
long long int dp(long long int i, long long int choto, long long int ld) {
  if (i == h.size()) {
    if (ld == b)
      return 1;
    else
      return 0;
  }
  long long int &ret = vis[i][choto][ld];
  if (ret != -1) return ret;
  ret = 0;
  if (!choto) {
    long long int ab = h[i] - '0';
    for (long long int j = 0; j <= ab; j++) {
      if (j == ab) {
        if (j == 4 || j == 7)
          ret += dp(i + 1, choto, ld + 1);
        else
          ret += dp(i + 1, choto, ld);
      } else {
        if (j == 4 || j == 7)
          ret += dp(i + 1, 1, ld + 1);
        else
          ret += dp(i + 1, 1, ld);
      }
    }
  } else {
    for (long long int j = 0; j <= 9; j++) {
      if (j == 4 || j == 7)
        ret += dp(i + 1, 1, ld + 1);
      else
        ret += dp(i + 1, 1, ld);
    }
  }
  return ret;
}
long long int fact(long long int num1, long long int num2) {
  if (num1 < num2) return 0;
  if (num1 == num2)
    return 1;
  else {
    long long int sum = num1 - num2;
    long long int res = 1;
    for (long long int i = sum + 1; i <= num1; i++) {
      res = (res * i) % 1000000007LL;
    }
    for (long long int i = 1; i <= num2; i++) {
      res = (res * MDINV(i, 1000000007LL)) % 1000000007LL;
    }
    return res;
  }
}
long long int digi[12];
long long int vi[12][100][7];
long long int dp1(long long int i, long long int ld, long long int nu) {
  if (i == b) {
    if (nu == 6 && ld < b)
      return 720;
    else
      return 0;
  }
  if (nu == 6) {
    if (ld < b)
      return 720;
    else
      return 0;
  }
  long long int &ret = vi[i][ld][nu];
  if (ret != -1) return ret;
  ret = 0;
  for (long long int j = 1; j <= min(6 - nu, digi[i]); j++) {
    ret = (ret + fact(digi[i], j) * dp1(i + 1, j * i + ld, nu + j)) %
          1000000007LL;
  }
  ret = (ret + dp1(i + 1, ld, nu)) % 1000000007LL;
  return ret;
}
int main() {
  long long int n, m;
  scanf("%lld", &n);
  h = NTS(n);
  long long int tot = 0;
  for (long long int i = 1; i <= ((int)h.size()); i++) {
    b = i;
    memset(vis, -1, sizeof vis);
    digi[i] = dp(0, 0, 0);
    tot += digi[i];
  }
  long long int res = 0;
  digi[0] = n - tot;
  for (int j = 1; j <= ((int)h.size()); j++) {
    b = j;
    memset(vi, -1, sizeof vi);
    res = (res + digi[j] * dp1(0, 0, 0)) % 1000000007LL;
  }
  printf("%lld\n", res);
  return 0;
}
