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: Time Limit Exceeded)

import java.util.*;

public class Main {
  
  private static final int MOD = 1_000_000_007;
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int[] A = new int[N];
    int g = 1;
    for (int i = 0; i < N; i++) {
      A[i] = sc.nextInt();
      g = gcd(g, A[i]);
    }
    
    List<Integer> primes = createPrimes();
    Map<Integer, Integer> lcmSpec = new HashMap<>();
    for (int i = 0; i < N; i++) {
      int a = A[i]/g;
      for (int prime : primes) {
        int count = 0;
        while (a%prime == 0) {
          count++;
          a /= prime;
        }
        int old = lcmSpec.getOrDefault(prime, 0);
        lcmSpec.put(prime, Math.max(old, count));
      }
      lcmSpec.put(a, 1);
    }
    
    long ans = 0;
    for (int i = 0; i < N; i++) {
      int a = A[i]/g;
      Map<Integer, Integer> amap = new HashMap<>();
      for (int prime : primes) {
        int count = 0;
        while (a%prime == 0) {
          count++;
          a /= prime;
        }
        amap.put(prime, count);
      }
      amap.put(a, 1);

      long B = g;
      for (Map.Entry<Integer, Integer> entry : lcmSpec.entrySet()) {
        int p = entry.getKey();
        int c = entry.getValue() - amap.getOrDefault(p, 0);
        while (c-- > 0) {
          B *= p;
          B %= MOD;
        }
      }

      ans += B;
      ans %= MOD;
    }

    System.out.println(ans);
  }
  
  private static int gcd(int a, int b) {
    if (b == 0) {
      return a;
    }
    return gcd(b, a%b);
  }
  
  private static List<Integer> createPrimes() {
    List<Integer> primes = new ArrayList<>();
    for (int a = 2; a <= 1_000; a++) {
      boolean isPrime = true;
      for (int i = 2; i*i <= a; i++) {
        if (a%i == 0) {
          isPrime = false;
          break;
        }
      }
      if (isPrime) {
        primes.add(a);
      }
    }
    return primes;
  }
}