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<bits/stdc++.h>
using namespace std;
#define rep(i,x,y) for(int i=x;i<y;i++)
#define range(a) (a).begin(),(a).end()
#define print(A,x,n) rep(i,0,n){cout<<(i ? " ":"")<<A[i]x;}cout<<endl;
#define pprint(A,y,m,n) rep(j,0,m){print(A[j],y,n);}
const long mod=1e9+7;
const int size=1e6;
const int inf=1e9;
int num[size]={};//0:prime,1:not prime
void sieve(){
    num[0]=1;num[1]=1;
    rep(i,0,size)if(num[i]==0){
        for(int j=2*i;j<size;j=j+i) num[j]=1;
    }return;
}
deque<int> prime;
void judge(){
	rep(i,0,size)if(num[i]==0) prime.push_back(i);
    return;
}
long modpow(long x,int n){
	int i=0;long res=1;
	while(n>=(1<<i)){
		if(n&(1<<i)) (res*=x)%=mod;
		i++;
		x=(x*x)%mod;
	}return res;
}
int main(){
	int N;cin>>N;
	int a;
    map<int,int> fact[N];
	map<int,int> gst;
    map<int,long> list;
	sieve(); judge();
	rep(i,0,N){
		cin>>a;
		int j=0; int cnt=0;
		while(a>1){
            while(a%prime[j]==0){
				a/=prime[j];
				fact[i][j]++;
			}
            gst[j]=max(gst[j],fact[i][j]);
            if(gst[j]) list[j]=prime[j];
            j++;
		}
	}
	long ans=0;
	rep(i,0,N){
        long res=1;
        for(pair<int,long> p:list){
            int j=p.first;
		    res*=modpow(p.second,gst[j]-fact[i][j]);
            //cout<<prime[j]<<" "<<gst[j]-fact[i][j]<<endl;
            res%=mod;
        }(ans+=res)%=mod;
	}cout<<ans<<endl;
}