// Breaking Sticks #include using namespace std; #define GET_MACRO(_1, _2, _3, NAME, ...) NAME #define _repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++) #define _rep(i,n) _repl(i,0,n) #define rep(...) GET_MACRO(__VA_ARGS__, _repl, _rep)(__VA_ARGS__) #define mp(a,b) make_pair((a),(b)) #define pb(a) push_back((a)) #define all(x) (x).begin(),(x).end() #define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x)) #define fi first #define se second #define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__) void _dbg(string){cout< void _dbg(string s,H h,T... t){int l=s.find(',');cout< ostream& operator<<(ostream &o, const pair &p){o<<"("< ostream& operator<<(ostream &o, const vector &v){o<<"[";for(T t:v){o< primes; bool isPrime[MAX_PRIME+1]; // sieve of Erastosthenes void prime_list(){ const int sz = MAX_PRIME; fill(isPrime, isPrime+sz+1, true); isPrime[0]=isPrime[1]=false; for(int i=4;i<=sz;i+=2) isPrime[i]=false; primes.pb(2); for(int i=3; i<=sz; i+=2){ if(isPrime[i]){ primes.pb(i); for(long j=(long)i*i; j<=sz; j+=i) isPrime[j]=false; } } } map memo; vector cv; long solve(long x){ if(x == 1) return 1; if(memo.count(x)>0) return memo[x]; int m = cv.size(); for(int i = m-1; i>=0; i--) if(x%cv[i]==0){//dbg(cv[i]); return memo[x] = cv[i] * solve(x/cv[i]) + 1; } assert(false); } int main(){ int n; cin>>n; long ans = 0; prime_list(); rep(i,n){ long x; cin>>x; long y = x; cv.clear(); for(long p : primes) if(x%p==0){ while(x%p==0) x /= p; cv.pb(p); } if(x > 1) cv.pb(x); // dbg(cv); ans += solve(y); } // dbg(vector>(all(memo))); cout << ans << endl; return 0; }