#include <bits/stdc++.h>
using namespace std;
const int MOD = (int)1e9 + 7;
int dig[12];
long long dp[12];
long long dp2;
int top;
long long add(long long x, long long y) {
  x += y;
  if (x >= MOD) x -= MOD;
  return x;
}
long long sub(long long x, long long y) {
  x -= y;
  if (x < 0) x += MOD;
  return x;
}
void dfs(int cent, int val, int vis, int i, int j) {
  if (i + j > top) return;
  if (cent == top) {
    dp[i + j] = add(dp[i + j], val);
    return;
  }
  if (vis == 0) {
    dfs(cent + 1, (long long)val * 8, 0, i, j);
    dfs(cent + 1, val, 0, i, j + 1);
    dfs(cent + 1, val, 0, i + 1, j);
  } else {
    if (dig[cent] != 7 && dig[cent] != 4) dfs(cent + 1, val, 1, i, j);
    if (dig[cent] >= 7) {
      if (dig[cent] == 7)
        dfs(cent + 1, val, 1, i, j + 1);
      else
        dfs(cent + 1, val, 0, i, j + 1);
    }
    if (dig[cent] >= 4) {
      if (dig[cent] == 4)
        dfs(cent + 1, val, 1, i + 1, j);
      else
        dfs(cent + 1, val, 0, i + 1, j);
    }
    if (dig[cent] > 7)
      dfs(cent + 1, (long long)val * (dig[cent] - 2), 0, i, j);
    else if (dig[cent] > 4)
      dfs(cent + 1, (long long)val * (dig[cent] - 1), 0, i, j);
    else if (dig[cent] > 0)
      dfs(cent + 1, (long long)val * dig[cent], 0, i, j);
  }
}
void dfs2(int cent, int total, int val, int mx) {
  if (cent == 6) {
    dp2 = add(dp2, val);
    return;
  }
  for (int i = 0; i + total <= mx; i++) {
    if (dp[i] == 0) continue;
    dp[i]--;
    dfs2(cent + 1, total + i, (long long)val * (dp[i] + 1) % MOD, mx);
    dp[i]++;
  }
}
int main() {
  int m;
  scanf("%d", &m);
  if (m == 7) {
    printf("0\n");
  } else {
    top = 0;
    while (m) {
      dig[top++] = m % 10;
      m /= 10;
    }
    for (int i = 0; i < top / 2; i++) swap(dig[i], dig[top - i - 1]);
    dfs(0, 1, 1, 0, 0);
    dp[0]--;
    long long ans = 0;
    for (int i = 1; i <= top; i++) {
      long long temp = dp[i];
      dp2 = 0;
      dfs2(0, 0, 1, i - 1);
      ans = add(ans, temp * dp2 % MOD);
    }
    cout << ans << endl;
  }
  return 0;
}
