func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MAX_N = 1e6 + 7, K = 21, M = 1e9 + 7;   long long n;   signed dp[MAX_N][K][2];   long long get(long long x) {     if (x > n) return 0;     return (n / x);   }   signed main() {     memset(dp, 0, sizeof(dp));     cin >> n;     long long poww = 0, cur = 1;     while (cur * 2 <= n) {       cur *= 2;       poww++;     }     dp[1][poww][0] = 1;     if ((cur / 2) * 3 <= n) dp[1][poww - 1][1] = 1;     for (long long i = 1; i < n; i++) {       for (long long j = 0; j <= poww; j++) {         for (long long k = 0; k <= 1; k++) {           long long t = 1;           if (k == 1) t = 3;           dp[i + 1][j][k] =               (dp[i + 1][j][k] + dp[i][j][k] * (get((1 << j) * t) - i)) % M;           if (j > 0)             dp[i + 1][j - 1][k] =                 (dp[i + 1][j - 1][k] +                  dp[i][j][k] * (get((1 << (j - 1)) * t) - get((1 << j) * t))) %                 M;           if (k == 1)             dp[i + 1][j][0] = (dp[i + 1][j][0] +                                dp[i][j][k] * (get(1 << j) - get((1 << j) * t))) %                               M;         }       }     }     cout << dp[n][0][0] << endl;     return 0;   }   