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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

void A_AC_or_WA(void) {

	int N, M;
	cin >> N >> M;
	cout << ((N == M) ? "Yes" : "No") << flush;
}

void B_Comparing_Strings(void) {

	int a, b;
	cin >> a >> b;

	for (int loop = 0; loop < max(a, b); loop++) cout << min(a, b);
	cout << flush;
	return;
}

void C_Low_Elements(void) {

	int N;
	cin >> N;

	vector<int> P(N);
	for (int& it : P) cin >> it;

	int PMin = 0;
	int counter = 0;
	for (int loop = 0; loop < N; loop++) {
		if (loop == 0 || P[loop] <= PMin) {
			counter++;
			PMin = P[loop];
		}
	}
	cout << counter << flush;
	return;
}

void D_Handstand2(void) {

	int N;
	cin >> N;

	int num[10][10] = { 0 };

	int length = 0;
	for (int loop = 1; loop <= N; loop++) {

		if (loop == (int)pow(10, length)) length++;
		num[int(loop / pow(10, length - 1))][loop % 10]++;
	}
	
	int counter = 0;
	for (int loop1 = 1; loop1 < 10; loop1++) {
		for (int loop2 = 1; loop2 < 10; loop2++) {
			counter += num[loop1][loop2] * num[loop2][loop1];
		}
	}
	cout << counter << flush;
	return;
}

void E_Flatten(void) {

	int N;
	cin >> N;

	vector<int> A(N);
	for (int& it : A) cin >> it;

	vector<map<int, int>> dA(N);

	map<int, int> dAB;
	for (int loop1 = 0; loop1 < N; loop1++) {

		int num = A[loop1];

		for (int loop = 2; loop <= A[loop1]; loop++) {
			if (num == 1) break;
			if (num % loop == 0) {
				num /= loop;
				dA[loop1][loop]++;
				loop--;
			}
		}

		for (auto loop = dA[loop1].begin(); loop != dA[loop1].end(); loop++) {

			if (dAB[loop->first] < loop->second)	dAB[loop->first] = loop->second;
		}
	}

	int sum = 0;
	for (auto it : dA) {

		long long B = 1;
		for (auto loop = dAB.begin(); loop != dAB.end(); loop++) {

			if (loop->second > it[loop->first]) {
				B *= (int)pow(loop->first, loop->second - it[loop->first]) % 1000000007;
			}
		}
		sum = (sum + B) % 1000000007;
	}
	cout << sum << flush;
	return;
}

int main(void) {

	//A_AC_or_WA();
	//B_Comparing_Strings();
	//C_Low_Elements();
	//D_Handstand2();
	E_Flatten();
	return 0;
}