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.io.*;
import java.math.*;
import java.util.*;

public class Main{

	private static final long mod=1000000007;
	private static final BigInteger MOD=BigInteger.valueOf(mod);

	static long gcd(long a,long b){
		return a%b==0?b:gcd(b,a%b);
	}
	static long lcm(long a,long b){
		return a/gcd(a,b)*b;
	}
	static BigInteger lcm(BigInteger a,BigInteger b){
		return a.divide(a.gcd(b)).multiply(b);
	}

	public static void main(String[] args){
		FastScanner s=new FastScanner(System.in);
		int n=s.nextInt();
		int[]a=new int[n];
		BigInteger[] b=new BigInteger[n];
		ArrayDeque<BigInteger>q=new ArrayDeque<>(n);
		for(int i=0;i<n;++i)
			b[i]=BigInteger.valueOf(a[i]=s.nextInt());
		for(int i=0;i<n;i+=2)
			q.add(BigInteger.valueOf(i==n-1?a[i]:lcm(a[i],a[i+1])));

		while(q.size()>=3)
			q.add(lcm(lcm(q.poll(),q.poll()),q.poll()));
		BigInteger lcm=q.size()==2?lcm(q.poll(),q.poll()):q.poll();

		long r=0;
		for(BigInteger o:b){
			r+=lcm.divide(o).remainder(MOD).intValue();
			r%=mod;
		}
		System.out.println(r);
	}
}

class FastScanner{
	private final BufferedInputStream	in;
	private static final int			bufSize	=1<<16;
	private final byte					buf[]	=new byte[bufSize];
	private int							i		=bufSize,k=bufSize;
	private final StringBuilder			str		=new StringBuilder();

	FastScanner(InputStream in){
		this.in=new BufferedInputStream(in,bufSize);
	}
	int nextInt(){
		return (int)nextLong();
	}
	long nextLong(){
		int c;
		long x=0;
		boolean sign=true;
		while((c=nextChar())<=32)
			;
		if(c=='-'){
			sign=false;
			c=nextChar();
		}
		if(c=='+'){
			c=nextChar();
		}
		while(c>='0'){
			x=x*10+(c-'0');
			c=nextChar();
		}
		return sign?x:-x;
	}
	private int nextChar(){
		if(i==k){
			try{
				k=in.read(buf,i=0,bufSize);
			}catch(IOException e){
				System.exit(-1);
			}
		}
		return i>=k?-1:buf[i++];
	}
	String next(){
		int c;
		str.setLength(0);
		while((c=nextChar())<=32&&c!=-1)
			;
		if(c==-1)
			return null;
		while(c>32){
			str.append((char)c);
			c=nextChar();
		}
		return str.toString();
	}
	String nextLine(){
		int c;
		str.setLength(0);
		while((c=nextChar())<=32&&c!=-1)
			;
		if(c==-1)
			return null;
		while(c!='\n'){
			str.append((char)c);
			c=nextChar();
		}
		return str.toString();
	}
}