func_code_string: #include <bits/stdc++.h>   long long nmax[11] = {0,      9,       99,       999,       9999,        99999,                         999999, 9999999, 99999999, 999999999, 9999999999LL};   long long P[11][11];   long long cnt[11][11][11], C[11][11], totalcnt[11][11], tmp;   long long nsel[11][11][11][11][11], fact[11], nways;   int N, x, y, len, i, j, jstart, nx, ny, cnx, cny, difx, dify, nextx, nexty;   void ComputeComb() {     int i, j;     C[0][0] = 1;     for (i = 1; i < 11; i++) {       C[i][0] = 1;       for (j = 1; j <= i; j++) {         C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % 1000000007;       }     }   }   inline int extended_gcd(long long A, long long B, long long &X, long long &Y) {     if (B == 0) {       X = 1;       Y = 0;       return A;     }     long long X0, Y0, D;     D = extended_gcd(B, A % B, X0, Y0);     X = Y0;     Y = X0 - (A / B) * Y0;     return D;   }   long long inv[11];   void ComputeInv() {     long long garbage;     for (int i = 1; i < 11; i++) {       extended_gcd(i, 1000000007, inv[i], garbage);       inv[i] %= 1000000007;       while (inv[i] < 0) inv[i] += 1000000007;     }   }   void ComputeFact() {     fact[0] = 1;     for (int i = 1; i < 11; i++) {       fact[i] = (fact[i - 1] * i) % 1000000007;     }   }   void ComputeP() {     int i, j;     for (i = 0; i < 11; i++) {       P[i][0] = 1;       for (j = 1; j < 11; j++) P[i][j] = (P[i][j - 1] * i) % 1000000007;     }   }   int digits[11], ndigits;   void GetN(int N) {     ndigits = 0;     while (N > 0) {       digits[ndigits] = N % 10;       N /= 10;       ndigits++;     }   }   long long totalcnt2[11][11];   void TestBruteForce() {     int x, y, i, j;     for (i = 1; i <= N; i++) {       x = y = 0;       j = i;       while (j > 0) {         if (j % 10 == 4)           x++;         else if (j % 10 == 7)           y++;         j /= 10;       }       totalcnt2[x][y]++;     }     for (x = 0; x < 11; x++)       for (y = 0; y < 11; y++)         if (totalcnt[x][y] != totalcnt2[x][y]) {           fprintf(stderr,  !!! x=%d y=%d: %I64d %I64d n , x, y, totalcnt[x][y],                   totalcnt2[x][y]);         }   }   int main() {     ComputeComb();     ComputeInv();     ComputeFact();     ComputeP();     scanf( %d , &N);     GetN(N);     for (len = 1; len < 11; len++)       for (x = 0; x < 11 && x <= len; x++)         for (y = 0; y < 11 && x + y <= len; y++) {           cnt[len][x][y] = 0;           if (len < ndigits) {             if (x == 0 && y == 0)               tmp = P[8][len] % 1000000007;             else {               tmp = (C[len][x] * C[len - x][y]);               tmp = (tmp * P[8][len - x - y]);             }             cnt[len][x][y] = tmp;           } else if (len == ndigits) {             nx = ny = 0;             for (i = ndigits - 1; i >= 0; i--) {               if (i == ndigits - 1)                 jstart = 1;               else                 jstart = 0;               for (j = jstart; j < digits[i]; j++) {                 cnx = nx;                 cny = ny;                 if (j == 4)                   cnx++;                 else if (j == 7)                   cny++;                 if (cnx <= x && cny <= y) {                   difx = x - cnx;                   dify = y - cny;                   if (difx == 0 && dify == 0)                     cnt[len][x][y] = (cnt[len][x][y] + P[8][i]);                   else                     cnt[len][x][y] = (cnt[len][x][y] + cnt[i][difx][dify]);                 }               }               if (digits[i] == 4)                 nx++;               else if (digits[i] == 7)                 ny++;             }             if (nx == x && ny == y) cnt[len][x][y]++;           }           if (len >= ndigits - 1) {             totalcnt[x][y] += cnt[len][x][y];             if (x == 0 && y == 0 && len == ndigits - 1) totalcnt[x][y]--;           }         }     for (x = 0; x < 11; x++)       for (y = 0; y < 11; y++)         if (totalcnt[x][y] > 0) {         }     nways = 1;     for (i = 0; i <= 6; i++) {       if (i > 0) {         nways = (nways * (totalcnt[0][0] - i + 1)) % 1000000007;         nways = (nways * inv[i]) % 1000000007;       }       nsel[0][0][0][0][i] = nways;     }     for (x = 0; x < 11; x++)       for (y = 0; y < 11; y++)         for (nx = 0; nx < 11; nx++)           for (ny = 0; ny < 11; ny++)             for (i = 0; i <= 6; i++)               if (nsel[x][y][nx][ny][i] > 0) {                 cnx = x;                 cny = y + 1;                 if (cny >= 11) {                   cnx++;                   cny = 0;                 }                 if (cnx >= 11) break;                 nways = 1;                 for (j = 0; j <= 6; j++) {                   nextx = nx + j * cnx;                   nexty = ny + j * cny;                   if (nextx >= 11 || nexty >= 11 || i + j > 6) break;                   if (j > 0) {                     nways = (nways * (totalcnt[cnx][cny] - j + 1)) % 1000000007;                     nways = (nways * inv[j]) % 1000000007;                   }                   tmp = (nways * nsel[x][y][nx][ny][i]) % 1000000007;                   nsel[cnx][cny][nextx][nexty][i + j] =                       (nsel[cnx][cny][nextx][nexty][i + j] + tmp) % 1000000007;                 }               }     long long answer = 0;     for (x = 0; x < 11; x++)       for (y = 0; y < 11; y++)         for (nx = 0; nx < 11; nx++)           for (ny = 0; ny < 11; ny++)             if (nx + ny < x + y) {               tmp = totalcnt[x][y];               tmp = (tmp * nsel[11 - 1][11 - 1][nx][ny][6]) % 1000000007;               answer = (answer + tmp) % 1000000007;             }     printf( %I64d n , (answer * fact[6]) % 1000000007);     return 0;   }   