#include using namespace std; vector computeOne(long x) { vector ans; while(0 == (x % 2)) { ans.push_back(2); x /= 2; } long p = 3; while(p * p <= x) { if(0 == (x % p)) { ans.push_back(p); x /= p; } else { p += 2; } } if(1 != x) ans.push_back(x); return ans; } struct Node { long val; int cnt; Node(long a, int b) : val(a), cnt(b) {} }; const int DP_SIZE = 50 * 1000 * 1000; long dp[DP_SIZE]; //long dfs(vector & vn, long x, vector & dp) { long dfs(vector & vn, long x) { if(x < DP_SIZE && -1 != dp[x]) return dp[x]; long ans = 0; for(int i = 0; i < vn.size(); i ++) { if(0 == vn[i].cnt) continue; vn[i].cnt --; //long lt = x / vn[i].val + dfs(vn, x / vn[i].val, dp); long lt = x / vn[i].val + dfs(vn, x / vn[i].val); ans = max(ans, lt); vn[i].cnt ++; } if(x < DP_SIZE) dp[x] = ans; return ans; } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long ans = 0; //vector dp(100000000, -1); for(int i = 0; i < DP_SIZE; i ++) dp[i] = -1; for(int i = 0; i < a.size(); i ++) { if(1 == a[i]) ans ++; else { vector vl = computeOne(a[i]); int j = 0; vector vn; while(j < vl.size()) { long vx = vl[j++]; int cnt = 1; while(j < vl.size() && vx == vl[j]) { j ++; cnt ++; } vn.push_back(Node(vx, cnt)); } //for(j = 0; j < vn.size(); j ++) printf("(%ld, %d) ", vn[j].val, vn[j].cnt); //printf("\n"); //long lt = dfs(vn, a[i], dp); long lt = dfs(vn, a[i]); ans += lt + a[i]; } } return ans; } int main() { int n = 0; cin >> n; vector a(n); for(int a_i = 0; a_i < n; a_i++){ cin >> a[a_i]; } long result = longestSequence(a); cout << result << endl; return 0; }