func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:64000000 )   using namespace std;   const int inf32 = 1e9 + 9;   const long long inf64 = 1e18 + 18;   const int N = 6e5 + 5;   const long long mod = 1e9 + 7;   map<int, int> mp;   vector<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};   int n, mx;   void go(int &f, int a, int b, int mn) {     if (a * b > mx) {       if (a % b) return;       mp[a] += mn;       f -= mn;       return;     }     go(f, a * b, b, (mn + 1) / 2);     if (a % b) return;     int t = min(f, mn);     mp[a] += t;     f -= t;   }   bool show() {     int rez = 0;     for (auto &x : mp) rez += x.second;     return rez == n;   }   bool check(int j) {     mp.clear();     mp[1] = n;     int half = (n + 1) / 2;     half += n / 100;     for (int i = 0; i < j; ++i) {       int x = primes[i];       int cnt = 0;       bool flag = true;       while (flag) {         flag = false;         for (auto &y : mp) {           if (!y.second || !(y.first % x)) continue;           int t = cnt;           cnt += y.second;           go(y.second, y.first, x, (y.second + 1) / 2);           cnt -= y.second;           flag |= t != cnt;           if (cnt >= half) break;         }         if (cnt >= (n + 1) / 2) break;       }       if (!flag) {         for (auto &y : mp) {           if (y.second > 1 && y.first * x < mx) {             mp[y.first * x] += 1;             --y.second;             ++cnt;           }           if (cnt >= (n + 1) / 2) break;         }         if (cnt < (n + 1) / 2) return false;       }     }     for (auto &y : mp) {       if (y.second > 1) {         for (int i = 0; i < j; ++i) {           int x = primes[i];           for (int i = x; y.second && i * y.first < mx; i *= x) {             if (!mp[y.first * i]) {               mp[y.first * i] = 1;               --y.second;             }           }         }       }     }     if (n > 1000) {       queue<int> lil;       for (int i = 0; i < j; ++i) {         for (int k = i + 1; k < j; ++k) {           int x = primes[i], y = primes[k];           if (!mp[x * y]) lil.push(x * y);           if (!mp[x]) lil.push(x);           if (!mp[y]) lil.push(y);           if (!mp[y * y]) lil.push(y * y);           if (!mp[x * x]) lil.push(x * x);           if (!mp[x * x * y]) lil.push(x * x * y);           if (!mp[x * y * y]) lil.push(x * y * y);           if (!mp[x * x * y * y]) lil.push(x * x * y * y);         }       }       for (auto &x : mp) {         while (x.second > 1) {           while (!lil.empty() && mp[lil.front()]) lil.pop();           if (lil.empty()) return false;           --x.second;           mp[lil.front()] = 1;           lil.pop();         }       }     }     for (auto &x : mp) {       if (x.second > 1) return false;     }     return true;   }   void solve() {     cin >> n;     mx = 2 * n * n;     for (int j = 1; !check(j); ++j)       ;     int cnt = 0;     for (auto &x : mp) {       if (x.second) cout << x.first <<    ;     }   }   int main() {     solve();     return 0;   }   