#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#define mod 998244353
#define inf 2147483647
typedef long long ll;
using namespace std;
struct node {
int t,id;
bool operator>(const node &a)const
{
return t>a.t;
}
};
priority_queue<node,vector<node>,greater<node> > q;
map<pair<int,int>,int> mp;
map<int,int> wmp;
int n,w,p[114514],pr[114514];
void work(int j)
{
ll ans=1,x=p[j];
for(int i=2;i<=x;i++)
{
int cnt=0;
while(x%i==0)
{
x/=i;
cnt++;
}
if (cnt>0)
{
mp[make_pair(j,i)]=cnt;
}
ans*=(cnt+1);
}
}
int main()
{
scanf("%d %d",&n,&w);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
work(i);
}
int y=w,prcnt=0;
for(int i=2;i<=y;i++)
{
int cnt=0;
while(y%i==0)
{
y/=i;
cnt++;
}
if (cnt>0)
{
prcnt++;
pr[prcnt]=i;
}
wmp[i]=cnt;
}
for(int i=1;i<=prcnt;i++)
{
bool bo=false;
int k,minn=inf;
for(int j=1;j<=n;j++)
{
if (mp[make_pair(j,pr[i])]<minn)
{
minn=mp[make_pair(j,pr[i])];
k=j;
}
if (p[j]%pr[i]!=0)
{
bo=true;
k=j;
break;
}
}
if (bo==true)
{
p[k]*=(ll)(pow(pr[i],wmp[pr[i]]));
p[k]%=mod;
mp[make_pair(k,pr[i])]=wmp[pr[i]];
}
else
{
for(int j=1;j<=n;j++)
{
q.push({mp[make_pair(p[j],pr[i])],j});
}
for(int j=1;j<=wmp[pr[i]];j++)
{
q.top().t++;
}
while(!q.empty())
{
mp[make_pair(q.top().id,pr[i])]=q.top().t;
q.pop();
}
}
}
ll anss=1;
for(int i=1;i<=n;i++)
{
int x=p[i];
for(int j=2;j<=x;j++)
{
int cnt=0;
while(x%j==0)
{
x/=j;
cnt++;
}
anss*=(cnt+1);
anss%=mod;
}
}
printf("%lld",anss%mod);
return 0;
}