func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 11;   const long long MOD = 1000000007LL;   int dp[N][N][3];   long long t[N][N];   int cnt[N], c[N];   int n;   string s;   long long ans = 0;   void init() {     for (int i = 0; i <= n; ++i) {       for (int k = 1; k <= 6; ++k) {         if (cnt[i] < k)           t[i][k] = 0;         else {           t[i][k] = 1LL;           for (int j = cnt[i] - k + 1; j <= cnt[i]; ++j) {             t[i][k] = (t[i][k] * (long long)j) % MOD;           }         }       }     }   }   void solve(int i, int k, int st) {     if (i > 6) {       long long p = cnt[st] * 1LL;       for (int j = 0; j <= n; ++j) {         if (c[j] == 0) continue;         if (c[j] > cnt[j]) return;         p = (p * t[j][c[j]]) % MOD;       }       ans = (ans + p) % MOD;       return;     }     for (int j = 0; j < k; ++j) {       c[j]++;       solve(i + 1, k - j, st);       c[j]--;     }   }   int main() {     cin >> s;     n = (int)(s).size();     memset(dp, 0, sizeof(dp));     for (int i = 1; i <= 9; ++i) {       int k;       if (i == 4 || i == 7)         k = 1;       else         k = 0;       dp[1][k][0] += (s[0] -  0  > i) ? 1 : 0;       dp[1][k][1] += (s[0] -  0  == i) ? 1 : 0;       dp[1][k][2] += (s[0] -  0  < i) ? 1 : 0;     }     for (int i = 2; i <= n; ++i) {       for (int k = 0; k <= i; ++k) {         dp[i][k][1] = ((s[i - 1] ==  4  || s[i - 1] ==  7 ) ? dp[i - 1][k - 1][1]                                                             : dp[i - 1][k][1]);         if ((s[i - 1] ==  4  || s[i - 1] ==  7 ) && k == 0) dp[i][k][1] = 0;         for (int j = 0; j < 10; ++j) {           if (j == 4 || j == 7) {             if (k != 0) {               dp[i][k][0] += (dp[i - 1][k - 1][0] +                               (j < (s[i - 1] -  0 ) ? dp[i - 1][k - 1][1] : 0));               dp[i][k][2] += (dp[i - 1][k - 1][2] +                               (j > (s[i - 1] -  0 ) ? dp[i - 1][k - 1][1] : 0));             }           } else {             dp[i][k][0] +=                 (dp[i - 1][k][0] + ((j < s[i - 1] -  0 ) ? dp[i - 1][k][1] : 0));             dp[i][k][2] +=                 (dp[i - 1][k][2] + ((j > s[i - 1] -  0 ) ? dp[i - 1][k][1] : 0));           }         }       }     }     for (int k = 0; k <= n; ++k) {       cnt[k] = 0;       for (int i = 1; i <= n; ++i) {         cnt[k] += dp[i][k][0] + dp[i][k][1];         if (i < n) cnt[k] += dp[i][k][2];       }     }     init();     ans = 0;     for (int i = 1; i <= n; ++i) {       solve(1, i, i);     }     printf( %I64d , ans);     return 0;   }   