#include using namespace std; vector pri(1000000,1); void SieveOfEratosthenes(long n) { // Create a boolean array "prime[0..n]" and initialize // all entries it as true. A value in prime[i] will // finally be false if i is Not a prime, else true. bool prime[n+1]; memset(prime, true, sizeof(prime)); for (long p=2; p*p<=n; p++) { // If prime[p] is not changed, then it is a prime if (prime[p] == true) { // Update all multiples of p for (long i=p*2; i<=n; i += p) prime[i] = false; } } long c = 0; // Print all prime numbers for (long p=2; p<=n; p++) if (prime[p]){ pri[c] = p; c++; } } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long sum = 0; long d; for(int i = 0; i < a.size(); i++){ sum += a[i]; d = 0; while(a[i]!=1){ if(a[i] % pri[d] == 0){ a[i] /= pri[d]; sum += a[i]; } else{ d++; if(pri[d]==1){ sum += 1; a[i] = 1; } } } } return sum; } int main() { long m = 1000000; SieveOfEratosthenes(m); 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; }