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: Accepted)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define chmin(x, y) x = min(x, y)
#define chmax(x, y) x = max(x, y)
#define MOD (int) (1e9+7)
#define INF (int) 2e9
#define LLINF (ll) 2e18


long long int rev_mod(long long int num){
	long long int pow_num = MOD - 2;
	long long int mod_num = MOD;
	long long int pow_cur = num;
	long long int ret = 1;
	while(pow_num > 0){
		if(pow_num % 2 == 1){
			ret *= pow_cur;
			ret %= mod_num;
		}
		pow_cur *= pow_cur;
		pow_cur %= mod_num;
		pow_num /= 2;
	}
	return ret;
}

vector<ll> factors[1100000];

int main(){
    for(int i = 2; i <= 1000100; i++){
		if(factors[i].size() == 0){
			for(int j = i; j <= 1000100; j += i){
				factors[j].push_back(i);
			}
		}
	}

    int n;
    cin >> n;
    map<ll, ll> m;

    ll tmplcm = 1;
    ll a[n];
    ll tmpp = 1, tmpr;
    rep(i, n){
        cin >> a[i];
        ll tmp = a[i];

        for(ll num : factors[tmp]){
			ll cnt = 0;
			while(tmp % num == 0){
				cnt += 1;
				tmp /= num;
			}
			m[num] = max(m[num], cnt);
		}
    }

    ll s = 1;
    for (auto p : m){
        rep(i, p.second){
            s *= p.first;
            s %= MOD;
        }
    }
    
    ll ans = 0;
    rep(i, n){
        ans += s * rev_mod(a[i]) % MOD;
        ans %= MOD;
    }
    cout << ans << endl;
    // printf("%d\n", N);
    return 0;
}