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

using System;
using System.Collections.Generic;
using System.Linq;

namespace AtCoderBeginnerContest152
{
	class Program
	{
		private const int ModNum = 1000000007;
		private static int[] PrimeNumbers;

		static void Main(string[] args)
		{
			var number = int.Parse(Console.ReadLine());
			var numbers = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();

			var maxNumber = numbers.Max();
			var tmp = Math.Sqrt(maxNumber) + 1;
			PrimeNumbers = GetPrimeNumberArray((int)tmp);

			var maxPrimeFactorization = PrimeFactorization(numbers[0]);
			for (var i = 1; i < number; i++)
			{
				var tmpResult = PrimeFactorization(numbers[i]);
				for (var j = 0; j < PrimeNumbers.Length; j++)
				{
					if (maxPrimeFactorization[j] < tmpResult[j])
					{
						maxPrimeFactorization[j] = tmpResult[j];
					}
				}
			}

			var result = 0L;
			for (var i = 0; i < number; i++)
			{
				var currentPrimeNumbers = PrimeFactorization(numbers[i]);
				result += CulculateNumber(maxPrimeFactorization, currentPrimeNumbers);
				result %= ModNum;
			}

			Console.WriteLine(result);
		}

		private static long CulculateNumber(int[] maxArray, int[] array)
		{
			var result = 1L;
			for (var i = 0; i < PrimeNumbers.Length; i++)
			{
				var tmp = maxArray[i] - array[i];
				if (tmp > 0)
				{
					for(var j = 0; j < tmp; j++)
					{
						result *= PrimeNumbers[i];
						result %= ModNum;
					}
				}
			}
			return result;
		}

		private static int[] PrimeFactorization(int number)
		{
			var index = 0;
			var result = new int[PrimeNumbers.Length];
			var num = number;
			while (index < PrimeNumbers.Length)
			{
				if (num % PrimeNumbers[index] == 0)
				{
					num /= PrimeNumbers[index];
					result[index]++;
				}
				else
				{
					index++;
				}
			}
			return result;
		}

		private static int[] GetPrimeNumberArray(int number)
		{
			var result = new List<int>();
			for (var i = 2; i <= number; i++)
			{
				if (isPrimeNumber(i))
				{
					result.Add(i);
				}
			}

			return result.ToArray();
		}

		private static bool isPrimeNumber(int source)
		{
			for (var i = 2; i < source; i++)
			{
				if (source % i == 0)
				{
					return false;
				}
			}
			return true;
		}
	}
}