#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int max_n = 11;
int m, n, lucky[max_n], ima[max_n], cnt[max_n], cifra[max_n],
    dp[max_n][max_n][3];
int f(int n, int k) {
  long long ret = 1;
  for (int i = 0; i < k; i++) ret = (ret * (n - i)) % MOD;
  return ret;
}
int solve(int sum, int lvl) {
  if (lvl && sum >= *lucky) return 0;
  long long ret = 0;
  if (lvl == 7) {
    memset(ima, 0, sizeof ima);
    for (int i = 0; i < 7; i++) ima[lucky[i]]++;
    ret = 1;
    for (int i = 0; i <= n; i++) ret = (ret * f(cnt[i], ima[i])) % MOD;
    return ret;
  }
  for (int i = 0; i <= n; i++)
    lucky[lvl] = i, ret += solve(lvl ? sum + i : sum, lvl + 1);
  return ret % MOD;
}
int get(int i, int j, int k) {
  return i >= 0 && j >= 0 && k >= 0 ? dp[i][j][k] : 0;
}
int srecan(int x) { return x == 4 || x == 7; };
int main() {
  cin >> m;
  for (++m; m; m /= 10) cifra[++n] = m % 10;
  ***dp = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 0; j <= n; j++) {
      dp[i][j][0] = get(i - 1, j, 0) << 3;
      dp[i][j][0] += get(i - 1, j - 1, 0) << 1;
      for (int k = 0; k < cifra[i]; k++)
        dp[i][j][1] += get(i - 1, j - srecan(k), 0);
      dp[i][j][1] += get(i - 1, j - srecan(cifra[i]), 1);
    }
  for (int i = 0; i <= n; i++) cnt[i] = get(n, i, 1);
  (*cnt)--;
  cout << solve(0, 0);
  return 0;
}
