#include #include using namespace std; typedef long long INT64; const int SIZE = 1000001; int isPrime[SIZE] = {0, }; int prime[78498] = {0, }; map m; void findPrime() { int i, j, k; k = 0; isPrime[0] = isPrime[1] = 1; for (i = 2; i < SIZE; i++) { if (isPrime[i] == 1) continue; prime[k] = i; k++; for (j = i + i; j < SIZE; j += i) { isPrime[j] = 1; } } } INT64 modmult(INT64 a, INT64 b, INT64 mod) { INT64 sum; if (a == 0 || b < mod / a) { return (a*b) % mod; } sum = 0; while (b > 0) { if (b & 1) sum = (sum + a) % mod; a = (2 * a) % mod; b >>= 1; } return sum; } INT64 modpow(INT64 a, INT64 b, INT64 mod) { INT64 product, pseq; product = 1; pseq = a % mod; while (b > 0) { if (b & 1) product = modmult(product, pseq, mod); pseq = modmult(pseq, pseq, mod); b >>= 1; } return product; } bool MillerRabin(INT64 n, int seed) { INT64 m, a; int i, k; if (n < 2) return false; if (n == 2) return true; if (!(n & 1)) return false; k = 0; m = n - 1; while (!(m & 1)) { m >>= 1; k++; } a = seed; a = modpow(a, m, n); if (a == 1 || a == n - 1) return true; for (i = 0; i < k - 1; i++) { a = modpow(a, 2, n); if (a == 1) return false; if (a == n - 1) return true; } return false; } bool primalityTest(INT64 n) { if (n < SIZE) { return !isPrime[n]; } else { return MillerRabin(n, 2) && MillerRabin(n, 3) && MillerRabin(n, 5) && MillerRabin(n, 7) && MillerRabin(n, 11); } } INT64 calcMaxMove(INT64 n) { map isbh; map::iterator it; map::reverse_iterator rit; int i, k; INT64 ans, c; ans = 1; while (n > 1) { if (primalityTest(n) == true) { it = isbh.find(n); if (it == isbh.end()) { isbh.insert(make_pair(n, 1)); } else { it->second++; } break; } for (i = 0; i < 78498; i++) { k = prime[i]; if (n % k == 0) { n /= k; it = isbh.find(k); if (it == isbh.end()) { isbh.insert(make_pair(k, 1)); } else { it->second++; } break; } } } c = 1; for (rit = isbh.rbegin(); rit != isbh.rend(); rit++) { k = rit->second; while (k--) { c *= rit->first; ans += c; } } return ans; } INT64 solve() { map::iterator it; INT64 ans; ans = 0; for (it = m.begin(); it != m.end(); it++) { ans += calcMaxMove(it->first) * it->second; } return ans; } int main(int argc, char* argv[]) { map::iterator it; int n; INT64 a; findPrime(); scanf("%d", &n); while (n--) { scanf("%lld", &a); it = m.find(a); if (it == m.end()) { m.insert(make_pair(a, 1)); } else { it->second++; } } printf("%lld\n", solve()); return 0; }