🚧 This website is under construction. 🚧
AtCoder
ABC
152
E

最大公約数
LCM
ABC
E

ABC152 E - Flatten

https://atcoder.jp/contests/abc152/tasks/abc152_e (opens in a new tab)
水色上位。数学。

最大公約数の求め方 全ての数に対して素因数分解を行い、各素数の max を取る方法 a * b // gcd(a, b) の結果を縮約する方法

おそらくどちらの方法でも計算量は変わらない(はず)

前者の方法だと逐次 MOD を取ることができるため、今回の問題設定上では高速に動作する。

import functools
 
 
def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)
 
 
def lcm(a, b):
    return a * b // gcd(a, b)
 
 
MOD = 10**9 + 7
 
n = int(input())
a = list(map(int, input().split()))
 
t = functools.reduce(lcm, a) % MOD
 
ans = 0
for i in range(n):
    ans += t * pow(a[i], MOD - 2, MOD)
    ans %= MOD
 
print(ans)
 
import collections
import functools
 
 
def factorize(n):
    res = collections.Counter()
    for d in range(2, int(n**.5) + 2):
        while n % d == 0:
            res[d] += 1
            n //= d
    if n != 1:
        res[n] += 1
    return res
 
 
MOD = 10**9 + 7
 
n = int(input())
a = list(map(int, input().split()))
 
_lcm = collections.Counter()
for e in a:
    for k, v in factorize(e).items():
        _lcm[k] = max(_lcm[k], v)
 
lcm = functools.reduce(lambda a, b: a * b % MOD,
                       (pow(k, v) for k, v in _lcm.items()),
                       1)
 
ans = 0
for i in range(n):
    ans += lcm * pow(a[i], MOD - 2, MOD)
    ans %= MOD
 
print(ans)