#include using namespace std; typedef unsigned long long ULL; ULL MX = 1000000000000; bitset<10000001> primes; map dp; ULL MN = numeric_limits::max(); vector P; void mark(ULL x, ULL N) { for (ULL i = 2; i*x < N; ++i) primes[i*x] = true; } void sieve(ULL N) { primes[0] = primes[1] = true; mark(2, N); for (ULL i = 3; i < N; i += 2) if(!primes[i]) mark(i, N); } ULL cmax(ULL n) { // cout << "Calc for " << n << endl; map::iterator mi = dp.find(n); if (mi != dp.end()) { // cout << "Val already calculated in dp " << mi->second << endl; return mi->second; } /* if (binary_search(P.begin(), P.end(), n)) { cout << "Val is prime so ans is " << n+1 << endl; dp[n] = n+1; return n+1; } */ ULL mn = 0; ULL SQRTN = sqrt(n)+1; for (int i = 2; i <= n/2; ++i) { if (n%i == 0) { ULL K = n/i; ULL ans = 1 + K*cmax(i); // cout << "Checking for factor " << i << " ans = " << ans << endl; mn = max(mn, ans); } } mn = max(mn, n+1); dp[n] = mn; return mn; } int main() { sieve(1000001); P.reserve(100000); for (int i = 0; i < primes.size(); ++i) if (!primes[i]) P.push_back(i); dp[1] = 1; dp[2] = 3; dp[3] = 4; ULL n, ans=0, mx=0; cin >> n; vector v(n); for (ULL i = 0; i < n; ++i) { ULL x; cin >> x; mx = max(mx, x); v[i] = x; } // cmax(mx); sort(v.begin(), v.end()); for (int i = v.size()-1; i >= 0; --i) { ULL aa = cmax(v[i]); // cout << "Max facs for " << v[i] << " = " << aa << endl; ans += aa; } cout << ans << endl; return 0; }