#include using namespace std; const long MAX = long(2e6) + 8; long sp[MAX]; vector prime; void sieve() { long i, j; sp[0] = sp[1] = 1; for(i = 2; i < MAX; i++) { if(!sp[i]) { sp[i] = i; for(j=i+i; j < MAX; j+=i) if(!sp[j]) sp[j] = i; } } for(i = 2; i < MAX; i++) if(i == sp[i]) prime.push_back(i); } bool isprime(long n) { long i; for(i = 0; prime[i]*prime[i] <= n; i++) { if(n%prime[i] == 0) return false; } return true; } long maxPrimeDivisor(long n) { long i; long v = n, mPD; mPD = 1; for(i = 0; prime[i]*prime[i] <= n; i++) { if(v%prime[i] == 0) { while(v % prime[i] == 0) v /= prime[i]; mPD = max(mPD, prime[i]); } } if(v > 1) mPD = max(mPD, v); return mPD; } long f(long n) { if(n == 1) return 1; if(isprime(n)) { return 1 + n; } else { long div = maxPrimeDivisor(n); return 1 + div * f(n/div); } } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long i, j; long ans = 0; for(i = 0; i < a.size(); i++) { ans += f(a[i]); } return ans; } int main() { sieve(); 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; }