#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#define mn 31000
#define ll long long
#define modd 998244353
using namespace std;
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while('0'>ch || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while('0'<=ch && ch<='9'){x=x*10+(ch-'0');ch=getchar();}
return x*f;
};
int n,w;
bool fi[mn];
int zs[mn],zl;
int p[mn];
priority_queue<ll,vector<ll>,greater<ll> > q;
int main(){
n=read();w=read();
if(n==1){
ll pl=read()*w;
ll ans=0;
for(int i=1;i*i<=pl;i++){
if(pl%i==0){
if(pl==i*i) ans=(ans+1)%modd;
else ans=(ans+2)%modd;
}
}cout<<ans%modd;
}else{
for(int i=2;i<=mn;i++){
if(!fi[i]){zl++;zs[zl]=i;}
for(int j=1;j<=zl;j++){
if(i*zs[j]>mn) break;
fi[i*zs[j]]=1;
}
}
for(int i=1;i<=n;i++) p[i]=read();
ll ans=1;
for(int i=1;i<=zl;i++){
int sl=0;
while(w%zs[i]==0){w=w/zs[i];sl++;}
for(int j=1;j<=n;j++){
ll cl=0;
while(p[j]%zs[i]==0){p[j]=p[j]/zs[i];cl++;}
if(!cl){
if(sl) sl--,cl++,q.push(cl+1);
}else q.push(cl+1);
}
while(sl){
ll nowl=q.top();
q.pop();q.push(nowl+1);sl--;
}
while(!q.empty()){
ans=(1ll*ans*q.top())%modd;q.pop();
}
}printf("%lld",ans);
}
return 0;
}