#include #define MAX_LEN 100000000 using namespace std; vector isPrime; void generatePrime() { // initially assume all integers are prime isPrime.assign(MAX_LEN+1, true); // mark non-primes <= n using Sieve of Eratosthenes for (long factor = 2; factor*factor <= MAX_LEN; factor++) { // if factor is prime, then mark multiples of factor as nonprime // suffices to consider mutiples factor, factor+1, ..., n/factor if (isPrime[factor]) { for (long j = factor; factor*j <= MAX_LEN; j++) { isPrime[factor*j] = false; } } } } long nextPrime(long p) { while (++p < MAX_LEN && !isPrime[p]); return p; } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long sum = 0; for (long l : a) { if (l == 1) { sum += 1; } else { long temp = l, prime = 2; while (temp > 0) { if (temp < MAX_LEN && isPrime[temp]) { sum += temp + 1; break; } else { sum += temp; while (temp % prime != 0) { prime = nextPrime(prime); } temp /= prime; } } } } return sum; } int main() { int n; cin >> n; vector a(n); for(int a_i = 0; a_i < n; a_i++){ cin >> a[a_i]; } generatePrime(); long result = longestSequence(a); cout << result << endl; return 0; }