RT,code:
#include <bits/stdc++.h>
#define rint register int
#define int long long
#define endl '\n'
using namespace std;
const int N = 2e4 + 5;
const int M = 2e2 + 5;
const int mod = 998244353;
int n, w;
int p[N];
int maxx = 0;
int c[N], d[N];
int m;
priority_queue<int, vector<int>, greater<int> > q[N];
void divide(int n)
{
m = 0;
memset(c, 0, sizeof c);
memset(d, 0, sizeof d);
for (rint i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
d[++m] = i;
c[m] = 0;
while (n % i == 0)
{
n /= i;
c[m]++;
}
}
}
if (n > 1)
{
d[++m] = n;
c[m] = 1;
}
maxx = max(maxx, m);
}
signed main()
{
cin >> n >> w;
for (rint i = 1; i <= n; i++)
{
cin >> p[i];
}
for (rint i = 1; i < N; i++)
{
q[i].push(0);
}
int ans = 1;
for (rint i = 1; i <= n; i++)
{
divide(p[i]);
for (rint j = 1; j <= m; j++)
{
q[d[j]].push(c[j]);
}
}
divide(w);
for (rint i = 1; i <= m; i++)
{
while (c[i]--)
{
int x = q[d[i]].top();
q[d[i]].pop();
q[d[i]].push(x + 1);
}
}
for (rint i = 1; i < N; i++)
{
while (!q[i].empty())
{
int x = q[i].top();
ans = ans * (x + 1) % mod;
q[i].pop();
}
}
cout << ans << endl;
return 0;
}