#include <bits/stdc++.h>
using namespace std;
constexpr unsigned long long kMod{998244353};
unsigned long long binpow(unsigned long long numm, unsigned long long poww) {
  if (poww == 0) return 1;
  if (poww % 2 == 0)
    return binpow(((numm % kMod) * (numm % kMod)) % kMod, poww / 2) % kMod;
  return ((numm % kMod) * binpow(numm, poww - 1)) % kMod;
}
unordered_map<unsigned long long, unsigned long long> fact;
vector<unsigned long long> problemNums;
unsigned long long gcd(unsigned long long a, unsigned long long b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
unsigned long long isPow4(unsigned long long numm) {
  unsigned long long l = 1, r = 37606;
  while (r - l > 1) {
    unsigned long long m = (l + r) / 2;
    unsigned long long c = m * m;
    c *= c;
    if (c == numm) return m;
    if (c < numm)
      l = m;
    else
      r = m;
  }
  if (l * l * l * l == numm) return l;
  if (r * r * r * r == numm) return r;
  return 0;
}
unsigned long long isPow3(unsigned long long numm) {
  unsigned long long l = 1, r = 1259921;
  while (r - l > 1) {
    unsigned long long m = (l + r) / 2;
    unsigned long long c = m * m * m;
    if (c == numm) return m;
    if (c < numm)
      l = m;
    else
      r = m;
  }
  if (l * l * l == numm) return l;
  if (r * r * r == numm) return r;
  return 0;
}
unsigned long long isPow2(unsigned long long numm) {
  unsigned long long l = 1, r = 1414213562;
  while (r - l > 1) {
    unsigned long long m = (l + r) / 2;
    unsigned long long c = m * m;
    if (c == numm) return m;
    if (c < numm)
      l = m;
    else
      r = m;
  }
  if (l * l == numm) return l;
  if (r * r == numm) return r;
  return 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    unsigned long long temp;
    cin >> temp;
    unsigned long long cres = 0;
    cres = isPow4(temp);
    if (cres != 0) {
      fact[cres] += 4;
      continue;
    }
    cres = isPow3(temp);
    if (cres != 0) {
      fact[cres] += 3;
      continue;
    }
    cres = isPow2(temp);
    if (cres != 0) {
      fact[cres] += 2;
      continue;
    }
    problemNums.push_back(temp);
  }
  for (int i = 0; i < problemNums.size(); ++i)
    for (int j = i + 1; j < problemNums.size(); ++j) {
      if (problemNums[i] == 1 || problemNums[j] == 1) continue;
      if (problemNums[i] == problemNums[j]) continue;
      unsigned long long g = gcd(problemNums[i], problemNums[j]);
      if (g == 1) continue;
      fact[g] += 2;
      ++fact[problemNums[i] / g];
      ++fact[problemNums[j] / g];
      problemNums[i] = 1;
      problemNums[j] = 1;
    }
  while (true) {
    unordered_map<unsigned long long, unsigned long long> current{};
    for (const auto &it : fact)
      for (int i = 0; i < problemNums.size(); ++i)
        if (problemNums[i] % it.first == 0) {
          ++current[it.first];
          ++current[problemNums[i] / it.first];
          problemNums[i] = 1;
        }
    if (current.empty()) break;
    for (const auto &it : current) fact[it.first] += it.second;
  }
  unsigned long long ans = 1;
  unordered_map<unsigned long long, unsigned long long> problems{};
  for (const auto &it : problemNums)
    if (it != 1) ++problems[it];
  for (const auto &it : fact) ans = (ans * (it.second + 1)) % kMod;
  for (const auto &it : problems) {
    ans = (ans * (it.second + 1)) % kMod;
    ans = (ans * (it.second + 1)) % kMod;
  }
  cout << ans << endl;
  return 0;
}
