#include using namespace std; vector factors; vector primes; const int MAXARRAYINDEX = 1000000; char trace[MAXARRAYINDEX]; void addtoprimes(int p) { if (2 <= p && p < MAXARRAYINDEX) { primes.push_back(p); int q = p < 1000 ? p*p : MAXARRAYINDEX; while (q < MAXARRAYINDEX) { trace[q] = 1; q += p; } } } int nextprime(int p) { if (2 <= p && p < MAXARRAYINDEX) { int q = p + 1; while (q < MAXARRAYINDEX) { if (trace[q] == 0) return q; else ++q; } } return 0; } void findprimes() { int p = 2; addtoprimes(p); while (p > 1 && p < MAXARRAYINDEX) { p = nextprime(p); addtoprimes(p); } } void factor(long n) { factors.clear(); int index = 0; int numPrimes = primes.size(); while (n > 1L) { while (index < numPrimes && (n % primes[index]) != 0) ++index; if (index >= numPrimes) { factors.push_back(n); break; } factors.push_back(primes[index]); n = n / primes[index]; } } long singlecase(long N) { factor(N); int k = factors.size() - 1; long steps = 0L; long pieces = 1L; for (int k = factors.size() - 1; k >= 0; --k) { steps += pieces; pieces *= factors[k]; } steps += N; return steps; } long longestSequence(vector a) { long sum = 0; for (int i = a.size() - 1; i >= 0; --i) { sum += singlecase(a[i]); } return sum; } int main() { findprimes(); 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; }