func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = (int)1e9;   const int toN = 58;   int pn, p[10000];   int n, a[10000], omask[10000];   int dp[110][1 << 18];   int ans[110][1 << 18];   bool isPrime(int n) {     if (n == 2) return true;     for (int i = 2; i * i <= n; ++i)       if (n % i == 0) return false;     return true;   }   int main() {     pn = 0;     for (int i = 2; i <= toN; ++i)       if (isPrime(i)) p[pn++] = i;     cin >> n;     for (int i = 0; i < n; ++i) cin >> a[i];     for (int i = 0; i <= n; ++i) {       for (int m = 0; m < (1 << pn); ++m) dp[i][m] = inf;     }     dp[0][0] = 0;     for (int i = 1; i <= toN; ++i) {       omask[i] = 0;       for (int j = 0; j < pn; ++j)         if (i % p[j] == 0) omask[i] |= (1 << j);     }     for (int m = 0; m < (1 << pn); ++m) {       for (int j = 1; j <= toN; ++j)         if ((omask[j] & m) == 0) {           for (int i = 0; i < n; ++i)             if (dp[i][m] < inf) {               int nm = (m | omask[j]);               if (dp[i + 1][nm] > dp[i][m] + abs(j - a[i])) {                 dp[i + 1][nm] = dp[i][m] + abs(j - a[i]);                 ans[i + 1][nm] = j;               }             }         }     }     int v = 0;     for (int m = 0; m < (1 << pn); ++m)       if (dp[n][v] > dp[n][m]) v = m;     vector<int> ansv;     for (int i = n; i >= 1; --i) {       ansv.push_back(ans[i][v]);       v = v - omask[ans[i][v]];     }     reverse((ansv).begin(), (ansv).end());     for (__typeof(ansv.begin()) it = ansv.begin(); it != ansv.end(); ++it)       cout << *it <<    ;     return 0;   }   