#include #include #include #include using namespace std; int main() { int n; cin >> n; vector pr(n + 1); for (int i = 0; i <= n; i++) { pr[i] = i; } // the number of small primes is at most 11. vector pos(n + 1); vector mask(n + 1); int k = 0; for (int i = 2; i * i <= n; i++) { if (pr[i] == i) { pos[i] = k; for (int j = i; j <= n; j += i) { while (pr[j] % i == 0) pr[j] /= i; mask[j] |= 1 << k; } k++; } } set L; for (int i = 2; i <= n; i++) { if (pr[i] >= 2) { L.insert(i); } } vector dp(1 << k, -1e9); dp[0] = 0; for (int i = 2; i <= n; i++) { if (pr[i] == 1) { for (int j = (1 << k) - 1; j >= 0; j--) { if ((mask[i] & j) == 0) { dp[mask[i] | j] = max(dp[mask[i] | j], dp[j] + i); } } } } for (int p : L) { vector tmp(dp); for (int i = 2; i <= n; i++) { if (pr[i] == p) { for (int j = 0; j < 1 << k; j++) { if ((mask[i] & j) == 0) { tmp[mask[i] | j] = max(tmp[mask[i] | j], dp[j] + i); } } } } dp = tmp; } cout << *max_element(dp.begin(), dp.end()) << endl; }