#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n) {
  long long r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1) r = r * a % P;
  return r;
}
long long inv(long long first) {
  return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;
}
inline int rd() {
  int first = 0;
  char p = getchar();
  while (p < '0' || p > '9') p = getchar();
  while (p >= '0' && p <= '9') first = first * 10 + p - '0', p = getchar();
  return first;
}
const int N = 1e6 + 10;
int m, w[N], max_p[N];
long long ret[N], ans, sz[N];
struct node {
  int id, dep;
} f[N];
vector<pair<int, int> > g[N];
int c[N];
int qry(int first) {
  int r = 0;
  for (; first <= m; first += first & -first) r += c[first];
  return r;
}
void add(int first) {
  for (; first; first ^= first & -first) ++c[first];
}
void build() {
  for (int i = 1; i <= 2 * m; ++i) sz[i] = c[i] = ret[i] = 0, g[i].clear();
  int top = 0, cur = 1;
  f[++top] = {1, 0};
  sz[1] = w[1];
  for (int i = 2; i <= m; ++i) {
    int lca_dep = qry(max_p[i]);
    int first = i;
    while (first != 1) {
      add(max_p[first]);
      first /= max_p[first];
    }
    if (lca_dep != f[top].dep) {
      while (top > 1 && f[top - 1].dep >= lca_dep) {
        g[f[top - 1].id].push_back({f[top].id, f[top].dep - f[top - 1].dep});
        sz[f[top - 1].id] += sz[f[top].id];
        --top;
      }
      if (f[top].dep > lca_dep) {
        g[++cur].push_back({f[top].id, f[top].dep - lca_dep});
        sz[cur] = sz[f[top].id];
        f[top] = {cur, lca_dep};
      }
    }
    int dep = qry(2);
    ret[1] += (long long)w[i] * dep;
    f[++top] = {++cur, dep};
    sz[cur] = w[i];
  }
  ans = ret[1];
  while (top > 1) {
    g[f[top - 1].id].push_back({f[top].id, f[top].dep - f[top - 1].dep});
    sz[f[top - 1].id] += sz[f[top].id];
    --top;
  }
}
void dfs(int first, int d) {
  for (auto e : g[first]) {
    int second = e.first;
    ret[second] = ret[first] + e.second * (sz[1] - 2ll * sz[second]);
    ans = min(ans, ret[second]);
    dfs(second, d + e.second);
  }
}
void work() {
  scanf("%d", &m);
  for (int i = 1; i <= m; ++i) {
    int t;
    scanf("%d", &t);
    t = max(t, 1);
    ++w[t];
  }
  m = 5e3 + 10;
  build();
  dfs(1, 0);
  printf("%lld\n", ans);
}
int main() {
  for (int i = 1; i <= N - 1; ++i) max_p[i] = i;
  for (int i = 2; i <= N - 1; ++i)
    if (max_p[i] == i) {
      for (int j = 2 * i; j < N; j += i) max_p[j] = i;
    }
  work();
}
