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[1000][n];
    for(int i = 0;i < n;i++)for(int j = 0;j < 1000;j++)pc[j][i] = 0;
    for(int i = 0;i < n;i++)for(int cc = 1;cc < 1000;cc++){
        if(ar[i] % (cc+1))continue;
        pc[cc][i]++;
        ar[i] /= (cc+1);
        cc--;
    }
    int mp[1000] = {0};
    for(int i = 1;i < 1000;i++)for(int si = 0;si < n;si++)mp[i] = smax(mp[i],pc[i][si]);
    long tmp = 1;
    for(int i = 1;i < 1000;i++)if(mp[i])for(int c = 0;c < mp[i];c++)tmp = mdml(tmp,i+1);
    for(int i = 0;i < n;i++)if(ar[i] != 1)tmp = mdml(tmp,ar[i]);
    long as = 0;
    for(int i = 0;i < n;i++)as = mdadd(as,tmp * mdinv(arcp[i]));
    printf("%ld",as);
}