#include using namespace std; void findPrimes(vector &primes) { primes.push_back(2); int n = 3; while (n <= 1000000) { bool isPrime = true; for (int i = 0; i < primes.size() && primes[i] <= sqrt(n) + 1; ++i) { if (n % primes[i] == 0) { isPrime = false; } } if (isPrime) { primes.push_back(n); } ++n; } } int binsearch(vector &sorted, long val, int left = 0, int right = 1000000) { if (right == left + 1) { return left; } if (val == sorted[(right+left)/2]) { return (right+left)/2; } else if (val < sorted[(right+left)/2]) { return binsearch(sorted, val, left, (left+right)/2); } else { return binsearch(sorted, val, (left+right)/2, right); } } long findLen(long val, vector &primes, int start_prime_ind) { if (val == 1) { return 1; } else if (val > primes.back()) { return val + 1; } else { int ans = 1; for (int i = start_prime_ind; i >= 0; --i) { int q = 0; while (val % primes[i] == 0) { ans *= primes[i]; val /= primes[i]; ++q; } if (q != 0) { start_prime_ind = i; break; } } return (ans - 1)/(primes[start_prime_ind] - 1) + ans*findLen(val, primes, start_prime_ind + 1); } } int maxPrime(long val, vector &primes) { int ind = binsearch(primes, val, 0, primes.size()); if (primes[ind] == val) { return ind; } return binsearch(primes, sqrt(val), 0, primes.size()) + 1; } long longestSequence(vector &a) { vector primes; findPrimes(primes); long answer = 0; for (auto ai : a) { answer += findLen(ai, primes, maxPrime(ai, primes)); } return answer; } int main() { int n; cin >> n; vector a(n); for(int a_i = 0; a_i < n; a_i++){ cin >> a[a_i]; } vector primes; findPrimes(primes); long result = longestSequence(a); cout << result << endl; return 0; }