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 Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

import java.util.*;

public class Main {
    static final int MOD = 1000000007;
	public static void main (String[] args) {
	    boolean[] base = new boolean[1000001];
	    base[0] = true;
	    base[1] = true;
	    int count = 0;
	    for (int i = 2; i < base.length; i++) {
	        if (base[i]) {
	            continue;
	        }
	        count++;
	        for (int j = 2; i * j < base.length; j++) {
	            base[i * j] = true;
	        }
	    }
	    int idx = 0;
	    int[] primes = new int[count];
	    for (int i = 0; i < count; i++) {
	        if (!base[i]) {
	            primes[idx] = i;
	            idx++;
	        }
	    }
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] arr = new int[n];
		HashMap<Integer, Integer> lcms = new HashMap<>();
		for (int i = 0; i < n; i++) {
		    int x = sc.nextInt();
		    arr[i] = x;
		    for (int j = 0; j < count && x > 1; j++) {
		        int cnt = 0;
		        while (x % primes[j] == 0) {
		            cnt++;
		            x /= primes[j];
		        }
	            if (cnt > 0 && (!lcms.containsKey(primes[j]) || lcms.get(primes[j]) < cnt)) {
	                lcms.put(primes[j], cnt);
	            }
		    }
		}
		long ans = 0;
		for (int i = 0; i < n; i++) {
		    long num = 1;
		    for (Map.Entry<Integer, Integer> entry : lcms.entrySet()) {
		        int x = entry.getKey();
		        int y = entry.getValue();
		        for (int j = 0; j < y; j++) {
		            if (arr[i] % x == 0) {
		                arr[i] /= x;
		            } else {
		                num *= x;
		                num %= MOD;
		            }
		        }
		    }
		    ans += num;
		    ans %= MOD;
		}
		System.out.println(ans);
   }

}