#include <bits/stdc++.h>
using namespace std;
const long long MD = 998244353;
long long gcd(long long a, long long b) {
  if (a % b == 0) return b;
  return gcd(b, a % b);
}
long long mySquareRoot(long long q) {
  long long l = 1;
  long long r = 1500000000;
  while (l < r) {
    if (l + 1 == r) {
      if (r * r <= q) return r;
      return l;
    }
    long long md = (l + r) / 2;
    if (md * md <= q)
      l = md;
    else
      r = md - 1;
  }
  return l;
}
long long myCubeRoot(long long q) {
  long long l = 1;
  long long r = 1500000;
  while (l < r) {
    if (l + 1 == r) {
      if (r * r * r <= q) return r;
      return l;
    }
    long long md = (l + r) / 2;
    if (md * md * md <= q)
      l = md;
    else
      r = md - 1;
  }
  return l;
}
long long checkSquare(long long q) {
  long long cd = mySquareRoot(q);
  if (cd * cd == q) return cd;
  return -1;
}
long long checkTriple(long long q) {
  long long cd = myCubeRoot(q);
  if (cd * cd * cd == q) return cd;
  return -1;
}
long long checkFourth(long long q) {
  long long hf = checkSquare(q);
  if (hf == -1) return -1;
  return checkSquare(hf);
}
class PhawinSet {
 public:
  map<long long, long long> lone;
  vector<long long> coupleList;

 public:
};
PhawinSet milin;
void addNumber(long long q) {
  long long c1 = checkFourth(q);
  if (c1 != -1) {
    milin.lone[c1] += 4;
    return;
  }
  long long c2 = checkTriple(q);
  if (c2 != -1) {
    milin.lone[c2] += 3;
    return;
  }
  long long c3 = checkSquare(q);
  if (c3 != -1) {
    milin.lone[c3] += 2;
    return;
  }
  milin.coupleList.push_back(q);
}
long long coupleSeparation() {
  set<long long> pt;
  for (map<long long, long long>::iterator it = milin.lone.begin();
       it != milin.lone.end(); it++) {
    pt.insert(it->first);
  }
  int z = milin.coupleList.size();
  for (int i = 0; i < z; i++)
    for (int j = i + 1; j < z; j++) {
      long long u = milin.coupleList[i];
      long long v = milin.coupleList[j];
      if (u == v) continue;
      long long g = gcd(u, v);
      if (g > 1) pt.insert(g);
    }
  map<long long, long long> survivor;
  for (long long u : milin.coupleList) {
    bool broken = false;
    long long rem = u;
    for (long long p : pt) {
      if (rem % p == 0) {
        broken = true;
        milin.lone[p]++;
        rem /= p;
      }
    }
    if (broken) {
      if (rem != 1) milin.lone[rem]++;
    } else {
      survivor[u]++;
    }
  }
  long long ret = 1;
  for (map<long long, long long>::iterator it = survivor.begin();
       it != survivor.end(); it++) {
    long long cnt = it->second;
    long long cur = ((cnt + 1) * (cnt + 1)) % MD;
    ret *= cur;
    ret %= MD;
  }
  for (map<long long, long long>::iterator it = milin.lone.begin();
       it != milin.lone.end(); it++) {
    long long cnt = it->second;
    ret *= (cnt + 1);
    ret %= MD;
  }
  return ret % MD;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    long long t;
    scanf("%I64d", &t);
    addNumber(t);
  }
  long long ans = coupleSeparation();
  printf("%I64d\n", ans);
  return 0;
}
