#include using namespace std; typedef long long ll; typedef pair ii; typedef vector vi; typedef vector vii; typedef vector Matrix; #define ALL(x) (x).begin(),(x).end() #define ff first #define ss second #define D(a) cerr << ">> " << #a << " = >" << a << "<" << endl #define PB push_back #define F(i,a,b) for ( int i = (a); i < (b); ++i ) #define FD(i,a,b) for ( int i = (a); i >= (b); --i ) #define R1(a) scanf("%d",&a) #define R2(a,b) scanf("%d%d",&a,&b) #define R3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define DR1(a) int a; scanf("%d",&a) #define DR2(a,b) int a,b; scanf("%d%d",&a,&b) #define DR3(a,b,c) int a,b,c; scanf("%d%d%d",&a,&b,&c) template ostream & operator<<(ostream & os, const pair & p) { return os << p.ff << " " << p.ss; } template ostream & operator<<(ostream & os, const vector & v) { for (size_t i = 0; i < v.size(); ++i) { if (i) os << " "; os << v[i]; } return os; } const int INF = 1e9 + 7; const double PI = acos(-1); const double EPS = 1e-9; const int N = 1e6+5; vi primes; vector isPrime(N, 1); void sieve() { isPrime[0] = isPrime[1] = 0; for (ll i = 2; i < N; ++i) { if (!isPrime[i]) continue; for (ll j = i*i; j < N; j += i) isPrime[j] = 0; primes.PB(i); } } bool IsPrime(ll n) { if (n < 2) return false; for (ll x : primes) { if (x >= n) break; if (n % x == 0) return false; } return true; } vector dp(N); void precompute() { dp[1] = 1; F(i,1,N) { for (int j = 2 * i; j < N; j += i) { dp[j] = max(dp[j], (j / i) * dp[i] + 1); } } } ll solve(ll n) { if (n < N) return dp[n]; ll r = n + 1; for (ll x = 2; x * x <= n; ++x) { if (n % x == 0) { r = max(r, n/x * solve(x) + 1); } } return r; for (int pf : primes) { if (n % pf == 0) { //r = max(r, pf * solve(n/pf) + 1); r = max(r, n/pf * solve(pf) + 1); } } return r; } int main( ) { ios::sync_with_stdio(0); sieve(); precompute(); int n; cin >> n; ll res = 0; F(i,0,n) { ll x; cin >> x; res += IsPrime(x) ? x + 1 : solve(x); } cout << res << endl; return 0; }