#include using namespace std; long int lim = 1000000; long long int sd[1000001]; bool is_prime[1000001]; long long int get_max_moves(long long int a){ if(a == 0 || a == 1){ return a; } if(a <= lim){ if(sd[a] == -1){ return (a + 1); } //cout << sd[a] << endl; return (1 + ((sd[a]) * (get_max_moves(a / sd[a])))); } bool found_factor = false; long long int factor; for(long long int index = 2; index <= lim; index ++){ if(is_prime[index]){ if((a % index) == 0){ found_factor = true; factor = index; } } } if(!found_factor){ return (a + 1); } return (1 + ((factor) * (get_max_moves(a / factor)))); } long long int longestSequence(vector a) { // Return the length of the longest possible sequence of moves. memset(is_prime, true, sizeof(is_prime)); memset(sd, -1, sizeof(is_prime)); is_prime[0] = is_prime[1] = false; for(long int index = 2; (index * index)<= lim; index ++){ if(is_prime[index]){ for(long int index2 = index * 2; index2 <= lim; index2 += index){ is_prime[index2] = false; sd[index2] = index; } } } long long int answer = 0; int length = a.size(); for(int index = 0; index < length; index ++){ answer += get_max_moves(a[index]); //cout << answer << endl; } 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]; } long long int result = longestSequence(a); cout << result << endl; return 0; }