Problem:
Score : 500 points

Problem Statement

Given are N positive integers A_1,...,A_N.

Consider positive integers B_1, ..., B_N that satisfy the following condition.

Condition: For any i, j such that 1 \leq i < j \leq N, A_i B_i = A_j B_j holds.

Find the minimum possible value of B_1 + ... + B_N for such B_1,...,B_N.

Since the answer can be enormous, print the sum modulo (10^9 +7).

Constraints

1 \leq N \leq 10^4

1 \leq A_i \leq 10^6

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 ... A_N

Output

Print the minimum possible value of B_1 + ... + B_N for B_1,...,B_N that satisfy the condition, modulo (10^9 +7).

Sample Input 1

3
2 3 4

Sample Output 1

13

Let B_1=6, B_2=4, and B_3=3, and the condition will be satisfied.

Sample Input 2

5
12 12 12 12 12

Sample Output 2

5

We can let all B_i be 1.

Sample Input 3

3
1000000 999999 999998

Sample Output 3

996989508

Print the sum modulo (10^9+7).

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<unordered_map>
#include<climits>
#include<cstdlib>
#include<cmath>
#include<string>
#include<iomanip>
#include<bitset>
#include<list>

using namespace std;

using ll = long long int;
using ull = unsigned long long int;

ll const MOD = 1000000007;
ll const INF = (long long int)1 << 61;

ll mypow(ll x,ll n,ll mod = MOD){
    ll ret = 1;
    while(n > 0){
        if(n&1){
            ret = (ret*x)%mod;
        }
        x = (x*x)%mod;
        n >>= 1;
    }
    return ret;
}

ll mygcd(ll a,ll b){
    if(b == 0)return a;
    return mygcd(b,a%b);
}

ll twoPow(ll shiftNum){
    return (1LL << (shiftNum - 1));
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    ll n;
    cin >> n;

    vector<ll> a(n);
    for(auto &x: a){
        cin >> x;
    }

    map<ll,ll> factorMap;
    vector<vector<pair<ll,ll>>> factorArr;

    for(const auto x: a){
        auto tmp = x;
        vector<pair<ll,ll>> localFactorArr;
        for(int i = 2; i*i <= x; i++){
            ll count = 0;
            while(tmp%i == 0){
                count++;
                tmp /= i;
            }
            if(count > 0){
                localFactorArr.push_back({i,count});
            }
        }
        if(tmp > 1){
            localFactorArr.push_back({tmp,1});
        }
        factorArr.push_back(localFactorArr);
        for(const auto y : localFactorArr){
            if(factorMap.find(y.first) != factorMap.end()){
                factorMap[y.first] = max(factorMap[y.first],y.second);
            }else{
                factorMap.insert({y.first,y.second});
            }
        }
    }

    ll ans = 0;

    for(const auto x : factorArr){
        set<ll> checked;
        ll tmpCalc = 1;
        for(const auto y : x){
            tmpCalc *= mypow(y.first,factorMap[y.first] - y.second);
            tmpCalc %= MOD;
            checked.insert(y.first);
        }
        for(const auto z : factorMap){
            if(checked.find(z.first) == checked.end()){
                tmpCalc *= mypow(z.first,z.second);
                tmpCalc %= MOD;
            }
        }
        ans += tmpCalc;
        ans %= MOD;
    }

    cout << ans << endl;

    return 0;
}