#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
const int inf = 0x3f3f3f3f;
long long gcd(long long x, long long y) {
  if (y == 0)
    return x;
  else
    return gcd(y, x % y);
}
long long ksm(long long a, long long b) {
  long long r = 1;
  while (b) {
    if (b & 1) r = (r * a) % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return r;
}
const int maxn = 1e5 + 100;
long long n;
map<long long, int> mp;
set<long long> s;
vector<long long> v;
int vis[505] = {0};
int main() {
  scanf("%lld", &n);
  for (int i = 1; i <= n; i++) {
    long long x;
    scanf("%lld", &x);
    long long n2 = pow(double(x), 0.5) + 1e-6,
              n3 = pow(double(x), 1.0 / 3.0) + 1e-6,
              n4 = pow(double(x), 0.25) + 1e-6;
    if (n4 * n4 * n4 * n4 == x) {
      s.insert(n4);
      mp[n4] += 4;
      continue;
    }
    if (n3 * n3 * n3 == x) {
      s.insert(n3);
      mp[n3] += 3;
      continue;
    }
    if (n2 * n2 == x) {
      s.insert(n2);
      mp[n2] += 2;
      continue;
    }
    v.push_back(x);
  }
  long long ans = 1;
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); i++) {
    long long num = -1, cnt = 0;
    if (vis[i]) continue;
    for (int j = 0; j < v.size(); j++) {
      if (v[i] == v[j]) {
        vis[j] = 1;
        cnt++;
        continue;
      }
      long long g = gcd(v[i], v[j]);
      if (g != 1 && g != v[i]) num = g;
    }
    set<long long>::iterator it;
    for (it = s.begin(); it != s.end(); it++)
      if (v[i] % (*it) == 0) num = *it;
    if (num == -1)
      ans = (ans * (1 + cnt) * (1 + cnt)) % mod;
    else
      mp[num] += cnt, mp[v[i] / num] += cnt;
  }
  map<long long, int>::iterator it;
  for (it = mp.begin(); it != mp.end(); it++)
    ans = (ans * (it->second + 1)) % mod;
  printf("%lld\n", ans);
  return 0;
}
