#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int P = 998244353;
int n;
long long a[maxn], ans, s[maxn], flag[maxn * 20], prime[maxn];
long long mp3[maxn * 20], mp4[maxn * 20], t0, t1, ban[maxn], con[maxn];
map<long long, int> fac;
map<long long, int>::iterator it;
pair<long long, int> tmp, z;
inline void insert(long long x, int cnt) {
  if (fac.count(x))
    fac[x] += cnt;
  else
    fac[x] = cnt;
}
inline long long read() {
  char ch = getchar();
  long long u = 0, f = 1;
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    u = u * 10 + ch - 48;
    ch = getchar();
  }
  return u * f;
}
inline long long gcd(long long x, long long y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline long long mul(long long x, long long y, long long p) {
  long long cnt = 0;
  while (y) {
    if (y & 1) cnt = (cnt + x) % p;
    x = (x + x) % p;
    y >>= 1;
  }
  return cnt;
}
inline long long ksm(long long x, long long k, long long p) {
  long long cnt = 1;
  while (k) {
    if (k & 1) cnt = mul(cnt, x, p);
    x = mul(x, x, p);
    k >>= 1;
  }
  return cnt;
}
inline bool judge(long long a, long long p) {
  long long q = p - 1;
  int k = 0;
  while (q % 2 == 0) ++k, q >>= 1;
  long long v = ksm(a, q, p);
  if (v == 1 || v == p - 1) return false;
  while (k-- != 0) {
    v = mul(v, v, p);
    if (v == p - 1) return false;
  }
  return true;
}
inline bool miller_rabbin(long long p) {
  if (p == 2) return true;
  if (p % 2 == 0) return false;
  for (register int i = 1; i <= 40; i++) {
    long long a = rand() % (p - 1) + 1;
    if (judge(a, p)) return false;
  }
  return true;
}
const int M = (1 << 7) - 1;
inline bool check3(int i) {
  int pos = lower_bound(mp3 + 1, mp3 + 1 + t0, a[i]) - mp3;
  if (mp3[pos] == a[i]) {
    insert(prime[pos], 3 * con[i]);
    return true;
  }
  return false;
}
inline bool check4(int i) {
  int pos = lower_bound(mp4 + 1, mp4 + 1 + t1, a[i]) - mp4;
  if (mp4[pos] == a[i]) {
    insert(prime[pos], 4 * con[i]);
    return true;
  }
  return false;
}
inline void check5(int i) {
  for (register int j = 1; j <= n; j++) {
    if (j == i || ban[j]) continue;
    long long d = gcd(a[i], a[j]);
    if (d == 1) continue;
    insert(d, con[i]);
    insert(a[i] / d, con[i]);
    return;
  }
  ans = ans * (con[i] + 1) % P * (con[i] + 1) % P;
}
int main() {
  n = read();
  ans = 1ll;
  for (register int i = 2; i <= 1300000; i++) {
    if (!flag[i]) prime[++prime[0]] = i;
    for (register int j = 1; j <= prime[0] && i * prime[j] <= 1300000; j++) {
      flag[i * prime[j]] = 1;
      if (i % prime[j] == 0) break;
    }
  }
  for (register int i = 1; i <= prime[0] && prime[i] <= 1259922; i++) {
    long long o = 1ll * prime[i] * prime[i];
    o = o * prime[i];
    mp3[++t0] = o;
  }
  for (register int i = 1; i <= prime[0] && prime[i] <= 37607; i++) {
    long long o = 1ll * prime[i] * prime[i];
    o = o * o;
    mp4[++t1] = o;
  }
  for (register int i = 1; i <= n; i++) a[i] = read();
  for (register int i = 1; i <= n; i++) {
    con[i]++;
    for (register int j = i + 1; j <= n; j++)
      if (a[i] == a[j]) ban[j] = 1, con[i]++;
  }
  for (register int i = 1; i <= n; i++) {
    if (ban[i]) continue;
    long long t = sqrt(a[i]);
    if (t * t == a[i] && miller_rabbin(t))
      insert(t, 2 * con[i]);
    else {
      if (check3(i))
        ;
      else if (check4(i))
        ;
      else
        check5(i);
    }
  }
  for (it = fac.begin(); it != fac.end(); it++) {
    ans = ans * ((*it).second + 1) % P;
  }
  cout << ans;
  return 0;
}
