#include #include #include using namespace std; constexpr int M = 1010101; vector isprime(M); vector minfactor(M); void init() { for (int i = 0; i < M; i++) isprime[i] = true, minfactor[i] = -1; isprime[0] = isprime[1] = false; for (int p = 2; p < M; p++) if (isprime[p]) { minfactor[p] = p; for (int q = p*2; q < M; q += p) { isprime[q] = false; if (minfactor[q] == -1) minfactor[q] = p; } } } vector> factorize(int n) { vector> res; while (n > 1) { int p = minfactor[n]; int e = 0; while (n%p == 0) n /= p, e++; res.emplace_back(p, e); } return res; } int main() { init(); int n; cin >> n; vector>> edges(M); long long ans = 0; for (int i = 0; i < n; i++) { int a; cin >> a; for (auto [p, e] : factorize(a)) { edges[p*e].emplace_back(i, n+p); ans += p*e; } } atcoder::dsu d(n + M); for (int w = M-1; w >= 0; w--) { for (auto [u, v] : edges[w]) { if (not d.same(u, v)) { d.merge(u, v); ans -= w; } } } cout << ans << "\n"; }