#include <bits/stdc++.h>
namespace lib {
using namespace std;
namespace rng {
struct Generator {
  mt19937 rng;
  Generator() {
    seed_seq seq{(uint64_t)chrono::duration_cast<chrono::nanoseconds>(
                     chrono::high_resolution_clock::now().time_since_epoch())
                     .count(),
                 (uint64_t)unique_ptr<char>(new char).get(),
                 (uint64_t)__builtin_ia32_rdtsc()};
    rng = mt19937(seq);
  }
  Generator(seed_seq& seq) : rng(seq) {}
  template <typename T,
            typename enable_if<is_integral<T>::value>::type* = nullptr>
  inline T uniform_int(T L, T R) {
    return uniform_int_distribution<T>(L, R)(rng);
  }
  template <typename T>
  inline T uniform_int(T N) {
    return uniform_int(T(), N - 1);
  }
  template <typename T>
  inline T uniform_real(T N) {
    return uniform_real(0.0, static_cast<double>(N));
  }
  template <typename T>
  inline T uniform_real(T L, T R) {
    return uniform_real_distribution<double>(static_cast<double>(L),
                                             static_cast<double>(R))(rng);
  }
  inline double uniform_real() { return uniform_real(0.0, 1.0); }
};
static Generator gen = Generator();
}  // namespace rng
static rng::Generator& rng_gen = rng::gen;
}  // namespace lib
using namespace std;
long long gcd(long long a, long long b) {
  return b == 0 ? abs(a) : gcd(abs(b), abs(a % b));
}
long long mul(unsigned long long a, unsigned long long b,
              unsigned long long mod) {
  long long ret = 0;
  for (a %= mod, b %= mod; b != 0;
       b >>= 1, a <<= 1, a = a >= mod ? a - mod : a) {
    if (b & 1) {
      ret += a;
      if (ret >= mod) ret -= mod;
    }
  }
  return ret;
}
long long power(long long x, long long p, long long MOD) {
  if (p == 0) return 1 % MOD;
  if (p == 1) return x % MOD;
  long long res = power(x, p / 2, MOD);
  res = mul(res, res, MOD);
  if (p & 1) res = mul(res, x, MOD);
  return res;
}
bool is_prime(long long x) {
  for (long long i = 2; i * i <= x; i++)
    if (x % i == 0) return false;
  return true;
}
long long pollard_rho(long long n, long long c) {
  long long x = 2, y = 2, i = 1, k = 2, d;
  while (true) {
    x = (mul(x, x, n) + c);
    if (x >= n) x -= n;
    d = gcd(x - y, n);
    if (d > 1) return d;
    if (++i == k) y = x, k <<= 1;
  }
  return n;
}
const long long MOD = 998244353;
const long long BAD = 800573297242118400;
const long long N = 505;
const long long MAX = 2e18 + 2;
long long a[N], g[N][N];
map<long long, long long> h;
map<long long, long long> inv;
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n;
  cin >> n;
  long long ptr = 0;
  for (long long i = 0; i < n; i++) {
    long long x;
    cin >> x;
    if (x == 1) continue;
    a[ptr++] = x;
    for (long long j = 0; j < ptr; j++)
      g[ptr - 1][j] = g[j][ptr - 1] = gcd(a[ptr - 1], a[j]);
  }
  n = ptr;
  for (long long i = 0; i < n; i++) inv[a[i]]++;
  for (long long j = 2; j * j * j <= MAX; j++) {
    long long u = j * j;
    long long cnt = 2;
    while (u <= MAX / j && u * j <= MAX) {
      u *= j;
      cnt++;
      auto it = inv.find(u);
      if (it == inv.end()) continue;
      auto v = it->second;
      h[j] += cnt * v;
      it->second = 0;
    }
  }
  for (auto& p : inv) {
    long long x = p.first;
    if (!p.second) continue;
    long long sx = sqrtl(x);
    for (long long j = -2; j <= 2; j++) {
      long long v = sx + j;
      if (is_prime(v) && v * v == x) {
        h[v] += 2 * p.second;
        p.second = 0;
        break;
      }
    }
  }
  while (true) {
    bool found = false;
    for (long long i = 0; i < n && !found; i++) {
      if (!inv[a[i]]) continue;
      for (long long j = 0; j < n; j++) {
        long long gg = g[i][j];
        if (gg != a[i] && gg > 1) {
          h[gg] += inv[a[i]];
          h[a[i] / gg] += inv[a[i]];
          inv[a[i]] = 0;
          found = true;
          break;
        }
      }
    }
    if (!found) break;
  }
  long long ans = 1;
  for (auto p : h) ans = ans * (p.second + 1) % MOD;
  for (auto p : inv) {
    ans *= (p.second + 1) * (p.second + 1) % MOD;
    ans %= MOD;
  }
  cout << ans << endl;
}
