#include using namespace std; long p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}; vector primes; map memo; void init_primes() { primes = vector(p, p + sizeof(p) / sizeof(long)); } void update_primes(long x) { if(primes.empty()) init_primes(); vector::iterator it; long c = primes.back(); bool isPrime = true; for(long y = primes.back(); y < x; y+=2 ) { for(it = primes.begin(); it != primes.end(); ++it) { if(y % (*it) == 0) { break; } } if(it == primes.end()) { // cout << y << ", "; primes.push_back(y); } } for(it = primes.begin(); it != primes.end(); ++it) { if(x % (*it) == 0) { isPrime = false; break; } } if(isPrime) { // cout << x << endl; primes.push_back(x); } } void update_primes_2(long n) { vector prime(n+1, true); for (long p=2; p*p <=n; ++p) { if (prime[p] == true) { for (long i=p*2; i<=n; i += p) prime[i] = false; } } primes.clear(); for (long p=2; p<=n; ++p) if (prime[p]) primes.push_back(p); } long getSequence(long x) { if(x == 0) return 0; if(x == 1) return 1; map::iterator xt = memo.find(x); if( xt != memo.end()) return xt->second; long seq = 1; long c, d; for(vector::reverse_iterator it = primes.rbegin(); it != primes.rend(); ++it) { c = *it; if(x == c) { seq = c + 1; break; } else if( x % c == 0) { d = x/c; seq = 1 + max(c * getSequence(d), d * getSequence(c)); break; } } memo[x] = seq; // cout << "seq " << x << " = " << seq << endl; return seq; } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long m = *max_element(a.begin(), a.end()); update_primes_2(m); long n = 0; for(vector::iterator it = a.begin(); it != a.end(); ++it) { n += getSequence(*it); } return n; } int main() { int n; 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; }