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# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		int N = int.Parse(Console.ReadLine());
		long[]A = new long[N];
		string[] str = Console.ReadLine().Split();
		for(var i=0;i<N;i++){
			A[i] = long.Parse(str[i]);
		}
		long ans = 1;
		long mod = 1000000007;
		var listA = new List<long>[N];
		var dic = new Dictionary<long,long>();
		var dicA = new Dictionary<long,long>[N];
		for(var i=0;i<N;i++){
			listA[i] = new List<long>();
			dicA[i] = new Dictionary<long,long>();
		}
		if(N>=2){
			listA[0] = PrimeFactors(A[0]);
			for(var i=0;i<listA[0].Count;i++){
				if(dicA[0].ContainsKey(listA[0][i])){
					dicA[0][listA[0][i]]++;
				} else {
					dicA[0][listA[0][i]] = 1;
				}
			}
			foreach(var i in dicA[0].Keys){
				if(dic.ContainsKey(i)){
					dic[i] = Math.Max(dic[i],dicA[0][i]);
				} else {
					dic[i] = dicA[0][i];
				}
			}
			listA[1] = PrimeFactors(A[1]);
			for(var i=0;i<listA[1].Count;i++){
				if(dicA[1].ContainsKey(listA[1][i])){
					dicA[1][listA[1][i]]++;
				} else {
					dicA[1][listA[1][i]] = 1;
				}
			}
			foreach(var i in dicA[1].Keys){
				if(dic.ContainsKey(i)){
					dic[i] = Math.Max(dic[i],dicA[1][i]);
				} else {
					dic[i] = dicA[1][i];
				}
			}
			long B = Lcm(A[0],A[1]);
			for(var i=2;i<N;i++){
				B = Lcm(A[i],B)%mod;
				listA[i] = PrimeFactors(A[i]);
				for(var j=0;j<listA[i].Count;j++){
					if(dicA[i].ContainsKey(listA[i][j])){
						dicA[i][listA[i][j]]++;
					} else {
						dicA[i][listA[i][j]] = 1;
					}
				}
				foreach(var j in dicA[i].Keys){
					if(dic.ContainsKey(j)){
						dic[j] = Math.Max(dic[j],dicA[i][j]);
					} else {
						dic[j] = dicA[i][j];
					}
				}
			}
			ans = 0;
			for(var i=0;i<N;i++){
				long a1 = 1;
				foreach(var j in dic.Keys){
					long d = dic[j];
					if(dicA[i].ContainsKey(j)){
						d -= dicA[i][j];
					}
					a1 = a1 * Mpow(j,d,mod) % mod;
				}
				ans = (ans + a1) % mod;
			}
		}
		Console.WriteLine(ans);
	}

	public static long Gcd(long a, long b) {
		if (a < b)
			return Gcd(b, a);
		while (b != 0) {
			var r = a % b;
			a = b;
			b = r;
		}
		return a;
	}
	public static long Lcm(long a, long b) {
        return a * b / Gcd(a, b);
    }
	
	public static long Mpow(long x,long n,long m)
	{
		long ans = 1;
		while(n > 0){
			if(n % 2 == 1){
				ans = ans * x % m;
				n -= 1;
			}
			x = x * x % m;
			n /= 2;
		}
		return ans;
	}
	public static List<long> PrimeFactors(long n){
		long i = 2;
		long tmp = n;
		var list = new List<long>();
		while(i*i<=n){
			if(tmp%i==0){
				tmp /= i;
				list.Add(i);
			} else {
				i++;
			}
		}
		if(tmp != 1){
			list.Add(tmp);
		}
		return list;
	}
}