#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
struct ModArithm {
  unsigned long long n;
  unsigned long long q = 0;
  long double fq;
  char shift = -1;
  ModArithm(unsigned long long _n) : n(_n) {
    fq = 1.0L / n;
    unsigned long long rem = 1;
    while (rem < n) {
      ++shift;
      rem <<= 1;
    }
    for (int i = 63; i >= 0; --i) {
      if (rem >= n) {
        q |= 1LL << i;
        rem -= n;
      }
      rem *= 2;
    }
  }
  unsigned long long multf(unsigned long long a, unsigned long long b) {
    unsigned long long mult = (long double)a * b * fq + 0.5L;
    long long res = a * b - mult * n;
    if (res < 0) res += n;
    return res;
  }
  unsigned long long fix(unsigned long long a) { return a; }
  unsigned long long mult(unsigned long long a, unsigned long long b) {
    return fix(multf(a, b));
  }
  unsigned long long sqp1(unsigned long long a) { return multf(a, a) + 1; }
};
unsigned long long pow_mod(unsigned long long a, unsigned long long n,
                           ModArithm &arithm) {
  unsigned long long res = 1;
  for (unsigned long long i = 1; i <= n; i <<= 1) {
    if (n & i) res = arithm.multf(res, a);
    a = arithm.multf(a, a);
  }
  return arithm.fix(res);
}
vector<char> small_primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
bool is_prime(unsigned long long n) {
  ModArithm arithm(n);
  if (n == 2 || n == 3) return true;
  if (!(n & 1) || n == 1) return false;
  unsigned long long s = __builtin_ctz(n - 1);
  unsigned long long d = (n - 1) >> s;
  for (unsigned long long a : small_primes) {
    if (a >= n) break;
    a = pow_mod(a, d, arithm);
    if (a == 1 || a == n - 1) continue;
    for (unsigned long long r = 1; r < s; ++r) {
      a = arithm.mult(a, a);
      if (a == 1) return false;
      if (a == n - 1) break;
    }
    if (a != n - 1) return false;
  }
  return true;
}
long long gcd(long long a, long long b) {
  if (a) return gcd(b % a, a);
  return b;
}
long long pollard_rho(long long n) {
  ModArithm arithm(n);
  int cum_cnt = 64 - __builtin_clz(n);
  cum_cnt *= cum_cnt / 5 + 1;
  while (true) {
    long long lv = rand() % n;
    long long v = arithm.sqp1(lv);
    int idx = 1;
    int tar = 1;
    while (true) {
      long long cur = 1;
      long long v_cur = v;
      int j_stop = min(cum_cnt, tar - idx);
      for (int j = 0; j < j_stop; ++j) {
        cur = arithm.multf(cur, abs(v_cur - lv));
        v_cur = arithm.sqp1(v_cur);
        ++idx;
      }
      cur = arithm.fix(cur);
      if (!cur) {
        for (int j = 0; j < cum_cnt; ++j) {
          long long g = gcd(2 * n + v - lv, n);
          if (g == 1) {
            v = arithm.sqp1(v);
          } else if (g == n) {
            break;
          } else {
            return g;
          }
        }
        break;
      } else {
        long long g = gcd(cur, n);
        if (g != 1) return g;
      }
      v = v_cur;
      idx += j_stop;
      if (idx == tar) {
        lv = v;
        tar *= 2;
        v = arithm.sqp1(v);
        ++idx;
      }
    }
  }
}
map<long long, int> prime_factor(long long n, map<long long, int> *res = NULL) {
  if (!res) {
    map<long long, int> res_act;
    for (int p : small_primes) {
      while (!(n % p)) {
        ++res_act[p];
        n /= p;
      }
    }
    if (n != 1) prime_factor(n, &res_act);
    return res_act;
  }
  if (is_prime(n)) {
    ++(*res)[n];
  } else {
    long long factor = pollard_rho(n);
    prime_factor(factor, res);
    prime_factor(n / factor, res);
  }
  return map<long long, int>();
}
int main() {
  int n;
  cin >> n;
  map<long long, int> factorization;
  for (int i = 0; i < n; ++i) {
    long long k;
    cin >> k;
    map<long long, int> cur_factorization = prime_factor(k);
    for (auto cur : cur_factorization) {
      factorization[cur.first] += cur.second;
    }
  }
  long long res = 1;
  for (auto cur : factorization) {
    res *= cur.second + 1;
    res %= mod;
  }
  cout << res << endl;
}
