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.Linq;//リストの使用
using System.Collections.Generic;
using System.Text;//テキストの高速出力に必要
class Program
{
	static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		long mod = 1000000007;
		long[] nums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);
    long[] numsSub = new long[n];
		long answer = 0;
    long modMemo = 1;//最大公約数の記録
    long commonMul = 1;//最小公倍数

    for(int i = 0; i < n; i++) numsSub[i] = nums[i];

    for(int i = 2; i <= 1000000; i++)
    {
      while(true)
      {
        int modCount = 0;
        for(int j = 0; j < n; j++)
        {
          if(nums[j] % i == 0)//割り切れるならば
          {
            modCount++;
          }
        }

        if(modCount != n) break;
        else
        {
          modMemo *= i;
          modMemo %= mod;
          for(int j = 0; j < n; j++) nums[j] /= i;
        }
      }
    }

    for(int i = 2; i <= 1000000; i++)
    {
      while(true)
      {
        int modCount = 0;
        for(int j = 0; j < n; j++)
        {
          if(nums[j] % i == 0)//割り切れるならば
          {
            modCount++;
          }
        }

        if(modCount < 2) break;
        else
        {
          modMemo *= i;
          modMemo %= mod;
          for(int j = 0; j < n; j++)
          {
            if(nums[j] % i == 0) nums[j] /= i;
          }
        }
      }
    }

    commonMul = modMemo;
    for(int i = 0; i < n; i++)
    {
      commonMul *= nums[i];
      commonMul %= mod;
    }

    for(int i = 0; i < n; i++)
    {
      long plusMemo = commonMul *DivideModReverse(numsSub[i], mod);
      answer += plusMemo;
      answer %= mod;
    }

		Console.WriteLine(answer);
	}

  static long DivideMod(long x, long a, long p)//戻り値はx^a(mod p)。O(loga)
  {
    long num = 2;
    long answer = 1;
    long check = a;
    long memo = x%p;
    
    while(check > 0)
    {
      if(check % num == num / 2)
      {
        check -= num / 2;
        answer *= memo;
        answer %= p;
      }
    memo *= memo;
    memo %= p;
    num *= 2;
    }
    return answer;
  }

  static long DivideModReverse(long x, long p)//戻り値はx^-1(mod p), pは素数。O(logp)
  {
    long answer = DivideMod(x, p-2, p);
    return answer;
  }
  
}