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: Wrong Answer)

#include "bits/stdc++.h"

//region Template
#include "ext/pb_ds/assoc_container.hpp"

using namespace __gnu_pbds;
using namespace std;

typedef long long ll;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

const int MOD = 1000000007;
using namespace std;
#define finish(x) cout << x; exit(0);
#define fastIO cin.tie(0); cin.sync_with_stdio(false);

void setIn(string s) { freopen(s.c_str(), "r", stdin); }
void setOut(string s) { freopen(s.c_str(),"w",stdout); }

//const string USCAO_TAG = "mountains";
void usaco(const string& USACO_TAG) { setIn(USACO_TAG + ".in"); setOut(USACO_TAG + ".out"); }
/*
template<typename... Args>
void print(Args... args) {
	#ifdef LOCAL
	((std::cout << args << " "), ...);
	cout << endl;
	#endif
}
 */
//endregion

/* Notes:
 * Farah </3
 */

const int MAXN = 1e5 + 5;
const int INF = 2e9;
map<int, int> fn;
set<int> f;
void primF(ll n){
    int cnt[1001];
    memset(cnt, 0, sizeof cnt);
    while(n % 2 == 0){
        cnt[2]++;
        f.insert(2);
        n /= 2;
    }
    fn[2] = max(fn[2], cnt[2]);
    for(int i = 3; i <= sqrt(n); i += 2){
        while(n % i == 0){
            cnt[i]++;
            f.insert(i);
            n /= i;
        }
    }
    if(n > 2){
        f.insert(n);
        fn[n] = max(1, fn[n]);
    }
    for(int i = 0; i <= 1000; i++){
        if(cnt[i]){
            fn[i] = max(fn[i], cnt[i]);
        }
    }
}
long long modPow(ll p, long long pow){
    long long ans = 1;
    //long long p = 2;
    while(pow){
        if(pow & 1)
            ans = (ans * p) % 1000000007;
        p = (p * p) % 1000000007;
        pow >>= 1;
    }
    return ans;
}
int main() {
    //usaco("milkvisits");

#ifdef LOCAL
    setIn("in.txt");
    setOut("out.txt");
#endif

    ll n;
    cin >> n;

    ll a[n];
    for(int i = 0 ; i < n; i++){
        cin >> a[i];
        primF(a[i]);
    }

    ll nm = 1;
    for(auto x : f){
        //cout << x << " " << fn[x] << endl;
        nm *= modPow(x, fn[x]);
    }
    ll ans = 0;
    for(int i = 0; i < n; i++){
        ans = (ans + nm / a[i]) % MOD;
    }
    //cout << nm << endl;
    cout << ans << endl;
}