n=int(eval(input()))

A=list(map(int,input().split()))

mod=10**9+7



import fractions

def lcm(a,b):

    return a*b//fractions.gcd(a,b)



def power(a):

    T=[a]

    while 2**(len(T))<mod:

        T.append(T[-1]**2%mod)

    b=bin(mod-2)

    ans=1

    for i in range(len(b)-2):

        if int(b[-i-1])==1:

            ans=ans*T[i]%mod

    return ans   



l=A[0]

for i in range(n-1):

    l=lcm(l,A[i+1])

l%=mod

s=0

for i in range(n):

    s+=l*power(A[i])%mod

    s%=mod

print(s)
n=int(eval(input()))

A=list(map(int,input().split()))

mod=10**9+7



def inverse(a): #aに対し、a**(mod-2)、つまり逆元を返す

    T=[a]

    while 2**(len(T))<mod: #a**1,a**2.a**4,a**8,...を計算しておく

        T.append(T[-1]**2%mod)

    b=bin(mod-2) #mod-2を2進数表記にする

    ans=1

    for i in range(len(b)-2):

        if int(b[-i-1])==1:

            ans=ans*T[i]%mod

    return ans



def make_eratosthenes(n): #エラストテネスの篩(最大の素因数を格納した配列)

    A=[0]*n

    A[0],A[1]=-1,-1

    for i in range(2,n):

        if A[i]==0:

            j=i

            while j<n:

                A[j]=i

                j+=i

    return A



E=make_eratosthenes(10**6+5)



l={}

for a in A:

    now=a

    f=[] #素因数格納配列

    while now>1:

        f.append(E[now])

        now//=E[now]

    chk=0 

    for p in f:

        if chk==p: #同じ素因数が複数あるときに飛ばす

            continue

        chk=p

        if p in list(l.keys()): #辞書に素因数がある場合、個数の多いほう

            l[p]=max(l[p],f.count(p))

        else: #辞書にない場合新規追加

            l[p]=f.count(p)



lcm=1

for k in l:

    for i in range(l[k]):

        lcm=lcm*k%mod

s=0

for i in range(n):

    s+=lcm*inverse(A[i])%mod

    s%=mod

print(s)
n = int(eval(input()))
A = list(map(int, input().split()))
mod = 10**9 + 7
import fractions


def lcm(a, b):
    return a * b // fractions.gcd(a, b)


def power(a):
    T = [a]
    while 2 ** (len(T)) < mod:
        T.append(T[-1] ** 2 % mod)
    b = bin(mod - 2)
    ans = 1
    for i in range(len(b) - 2):
        if int(b[-i - 1]) == 1:
            ans = ans * T[i] % mod
    return ans


l = A[0]
for i in range(n - 1):
    l = lcm(l, A[i + 1])
l %= mod
s = 0
for i in range(n):
    s += l * power(A[i]) % mod
    s %= mod
print(s)

n = int(eval(input()))
A = list(map(int, input().split()))
mod = 10**9 + 7


def inverse(a):  # aに対し、a**(mod-2)、つまり逆元を返す
    T = [a]
    while 2 ** (len(T)) < mod:  # a**1,a**2.a**4,a**8,...を計算しておく
        T.append(T[-1] ** 2 % mod)
    b = bin(mod - 2)  # mod-2を2進数表記にする
    ans = 1
    for i in range(len(b) - 2):
        if int(b[-i - 1]) == 1:
            ans = ans * T[i] % mod
    return ans


def make_eratosthenes(n):  # エラストテネスの篩(最大の素因数を格納した配列)
    A = [0] * n
    A[0], A[1] = -1, -1
    for i in range(2, n):
        if A[i] == 0:
            j = i
            while j < n:
                A[j] = i
                j += i
    return A


E = make_eratosthenes(10**6 + 5)
l = {}
for a in A:
    now = a
    f = []  # 素因数格納配列
    while now > 1:
        f.append(E[now])
        now //= E[now]
    chk = 0
    for p in f:
        if chk == p:  # 同じ素因数が複数あるときに飛ばす
            continue
        chk = p
        if p in list(l.keys()):  # 辞書に素因数がある場合、個数の多いほう
            l[p] = max(l[p], f.count(p))
        else:  # 辞書にない場合新規追加
            l[p] = f.count(p)
lcm = 1
for k in l:
    for i in range(l[k]):
        lcm = lcm * k % mod
s = 0
for i in range(n):
    s += lcm * inverse(A[i]) % mod
    s %= mod
print(s)

-import fractions -def lcm(a, b): -    return a * b // fractions.gcd(a, b) - - -def power(a): +def inverse(a):  # aに対し、a**(mod-2)、つまり逆元を返す -    while 2 ** (len(T)) < mod: +    while 2 ** (len(T)) < mod:  # a**1,a**2.a**4,a**8,...を計算しておく -    b = bin(mod - 2) +    b = bin(mod - 2)  # mod-2を2進数表記にする -l = A[0] -for i in range(n - 1): -    l = lcm(l, A[i + 1]) -l %= mod +def make_eratosthenes(n):  # エラストテネスの篩(最大の素因数を格納した配列) +    A = [0] * n +    A[0], A[1] = -1, -1 +    for i in range(2, n): +        if A[i] == 0: +            j = i +            while j < n: +                A[j] = i +                j += i +    return A + + +E = make_eratosthenes(10**6 + 5) +l = {} +for a in A: +    now = a +    f = []  # 素因数格納配列 +    while now > 1: +        f.append(E[now]) +        now //= E[now] +    chk = 0 +    for p in f: +        if chk == p:  # 同じ素因数が複数あるときに飛ばす +            continue +        chk = p +        if p in list(l.keys()):  # 辞書に素因数がある場合、個数の多いほう +            l[p] = max(l[p], f.count(p)) +        else:  # 辞書にない場合新規追加 +            l[p] = f.count(p) +lcm = 1 +for k in l: +    for i in range(l[k]): +        lcm = lcm * k % mod -    s += l * power(A[i]) % mod +    s += lcm * inverse(A[i]) % mod