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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#define MOD 1000000007
#define smax(a,b) ((a)>(b)?(a):(b))

static inline long mdml(long a,long b){
    long long res = (long long)a * b;
    return res % MOD; 
}

static inline long mdinv(long num){
    unsigned long modinv = (unsigned long)MOD - 2u;
    long res = 1;
    while(modinv){
        if(1lu & modinv)res = mdml(res,num);
        num = mdml(num,num);
        modinv >>= 1;
    }
    return res % MOD;
}

static inline long mdadd(long a,long b){
    return ((long long)a+b) % MOD;
}

int main(void){
    int n;
    scanf("%d",&n);
    long ar[n],arcp[n];
    for(int i = 0;i < n;i++)scanf("%ld",&ar[i]);
    for(int i = 0;i < n;i++)arcp[i] = ar[i];
    int pc[100][n];
    for(int i = 0;i < n;i++)for(int j = 0;j < 100;j++)pc[j][i] = 0;
    for(int i = 0;i < n;i++)for(int cc = 1;cc < 100;cc++){
        _Bool fl = 0;
        fl = (_Bool)(ar[i] % (cc+1)) || fl;
        if(fl)continue;
        pc[cc][i]++;
        ar[i] /= (cc+1);
        cc--;
    }
    int mp[100] = {0};
    long asar[n];
    for(int i = 0;i < n;i++)asar[i] = mdinv(arcp[i]);
    for(int i = 1;i < 100;i++)for(int si = 0;si < n;si++)mp[i] = smax(mp[i],pc[i][si]);
    for(int ni = 0;ni < n;ni++){
        for(int i = 1;i < 100;i++)for(int c = 0;c < mp[i];c++)asar[ni] = mdml(asar[ni],i+1);
        for(int i = 0;i < n;i++)if(ar[i] != 1)asar[ni] = mdml(asar[ni],ar[i]);
    }
    long as = 0;
    for(int i = 0;i < n;i++)as = mdadd(as,asar[i]);
    printf("%ld",as);
}