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: Wrong Answer)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.StringTokenizer;

public class Main {
	static HashMap<Integer, Integer> primefactors;
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		BufferedReader br = new BufferedReader(new FileReader("input"));
		PrintWriter out = new PrintWriter(System.out);
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		int a[] = new int[n];
		primefactors = new HashMap<>();
		while(n-->0) {
			a[n] = Integer.parseInt(st.nextToken());
			pf(a[n]);
		}
		long ans = 0;
		for(int e:a) {
			long lcm = 1;
			boolean f = false;
			for(Entry<Integer, Integer> ent:primefactors.entrySet()) {
				int t = pow(ent.getKey(),ent.getValue());
				lcm *= t;
				if(lcm%e == 0 && !f) {
					lcm/=e;
					f = true;
				}else if(f){
					lcm %= (1e9 + 7);
				}
			}
			ans += lcm;
			ans%= (1e9 + 7);
		}
		out.println(ans);
		out.flush();
	}
	static int pow(int n, int m) {
		if(m == 0) return 1;
		if(m == 1) return n;
		int ans = n;
		if(m%2 == 0) {
			int tmp = pow(ans,m/2);
			ans = tmp*tmp;
		}else {
			int tmp = pow(ans,--m);
			ans = n*tmp;
		}
		return ans;
	}
 	static void pf(int n) {
 		int cnt;
 		int l = n;
 		for(int i=2;i*i<=l;i++) {
 			cnt = 0;
 			while(n>1 && n%i == 0) {
 				cnt++;
 				n/=i;
 			}
 			if(cnt > 0)
 			{
 				primefactors.put(i, Math.max(cnt,primefactors.getOrDefault(i, 0)));
 			}
 		}
 		if(n>1)
 		{
 			primefactors.put(n, Math.max(1, primefactors.getOrDefault(n, 0)));
 		}
 	}
}