#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int N = 300000, _ = N + 7, mo = 1000000007;
template <typename T1, typename T2>
inline T1 ad(T1 &a, T2 b) {
  return a = a + b >= mo ? a + b - mo : a + b;
}
template <typename T1, typename T2>
inline T1 dl(T1 &a, T2 b) {
  return a = a >= b ? a - b : a - b + mo;
}
template <typename T1, typename T2>
inline T1 add(T1 a, T2 b) {
  return a + b >= mo ? a + b - mo : a + b;
}
template <typename T1, typename T2>
inline T1 del(T1 a, T2 b) {
  return a >= b ? a - b : a - b + mo;
}
long long powa(long long a, long long t) {
  long long b = 1;
  a = (a + mo) % mo;
  while (t) {
    if (t & 1) b = b * a % mo;
    a = a * a % mo, t >>= 1;
  }
  return b;
}
inline long long inva(long long a) { return powa(a, mo - 2); }
long long jc[_], rjc[_];
void fuck(int n = _ - 1) {
  jc[0] = jc[1] = rjc[0] = 1;
  for (int i = 2; i <= n; i++) jc[i] = jc[i - 1] * i % mo;
  rjc[n] = inva(jc[n]);
  for (int i = n - 1; i >= 1; i--) rjc[i] = rjc[i + 1] * (1ll + i) % mo;
}
long long C(int n, int m) {
  if (n < m || n < 0 || m < 0) return 0;
  return jc[n] * rjc[m] % mo * rjc[n - m] % mo;
}
int n, val[_];
vector<int> hav[_];
long long dlt[_] = {0};
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  fuck();
  n = ty();
  for (int i = 1; i <= n; i++) val[i] = ty();
  for (int i = 1; i <= n; i++) {
    int a = val[i];
    for (int j = 2; j * j <= a; j++) {
      if (a % j) continue;
      int cnt = 0;
      while (a % j == 0) cnt++, a /= j;
      hav[j].emplace_back(cnt);
    }
    if (a > 1) hav[a].emplace_back(1);
  }
  long long ans = 0;
  dlt[0] = del(powa(2, n - 1), 1);
  for (int i = 1; i < n; i++)
    dlt[i] = del(dlt[i - 1], add(C(n - 1, i), C(n - 1, i - 1)));
  for (int i = 1; i <= N; i++) {
    sort(hav[i].begin(), hav[i].end(), greater<int>());
    for (int j = 0, jj = hav[i].size(); j < jj; j++)
      ad(ans, dlt[j] * hav[i][j] % mo);
  }
  cout << ans << lf;
  return 0;
}
