func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 12, mod = 1e9 + 7;   long long dp[maxn][2][maxn];   int num[maxn];   long long dfs(int pos, bool bnd, int ned) {     if (ned < 0) return 0;     if (pos < 0) return ned == 0;     long long& ndp = dp[pos][bnd][ned];     if (~ndp) return ndp;     ndp = 0;     int bound = bnd ? num[pos] : 9;     for (int i = 0; i <= bound; i++)       ndp += dfs(pos - 1, bnd && i == bound, ned - (i == 4 || i == 7));     return ndp;   }   long long cnt[maxn];   int init(long long x) {     int len = 0;     while (x) {       num[len++] = x % 10;       x /= 10;     }     memset(dp, -1, sizeof(dp));     for (int i = len; i >= 0; i--) {       cnt[i] = dfs(len - 1, true, i);     }     cnt[0]--;     return len;   }   long long ans;   void dfs(int st, long long v, int len, int adder) {     if (st == 7) {       for (int i = adder + 1; i <= len; i++) {         (ans += v * cnt[i] % mod) %= mod;       }       return;     }     if (adder >= len) return;     for (int i = 0; i <= len; i++) {       if (cnt[i] == 0) continue;       long long mid = v * cnt[i] % mod;       cnt[i]--;       dfs(st + 1, mid, len, adder + i);       cnt[i]++;     }   }   int main() {     long long n;     scanf( %I64d , &n);     int len = init(n);     ans = 0;     dfs(1, 1, len, 0);     printf( %I64d n , ans);     return 0;   }   