#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1E-8;
char dig[20];
int dp[20][20][2];
int islucky(int i) { return (i == 4 || i == 7) ? 1 : 0; }
long long dfs(int pos, int cnt, bool bound) {
  if (!pos) return cnt == 0;
  if (!bound && ~dp[pos][cnt][bound]) return dp[pos][cnt][0];
  long long ret = 0;
  int end = bound ? dig[pos] - '0' : 9;
  for (int i = 0; i <= end; i++) {
    if (islucky(i))
      ret += dfs(pos - 1, cnt - 1, bound && i == end);
    else
      ret += dfs(pos - 1, cnt, bound && i == end);
  }
  return dp[pos][cnt][bound] = ret;
}
int c[20], m;
void cal(long long x) {
  sprintf(dig + 1, "%I64d", x);
  int len = strlen(dig + 1);
  reverse(dig + 1, dig + 1 + len);
  for (int i = 0; i <= 9; i++) c[i] = dfs(len, i, 1);
  c[0]--;
}
const int mod = 1000000007;
long long ans;
void dfs2(int dep, int tot, long long ways) {
  if (dep == 7) {
    int cnt = 0;
    for (int i = 9; i > tot; i--) cnt += c[i];
    ans = (ans + cnt * ways) % mod;
  } else {
    for (int i = 0; i < 10; i++)
      if (c[i] > 0) {
        c[i]--;
        dfs2(dep + 1, tot + i, ways * (c[i] + 1) % mod);
        c[i]++;
      }
  }
}
int main() {
  (memset(dp, -1, sizeof(dp)));
  scanf("%d", &m);
  cal(m);
  ans = 0;
  dfs2(1, 0, 1);
  printf("%I64d\n", ans);
  return 0;
}
