WA on 14
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int n,w;
int LW[1300];
int TW[1300];
int top = 1;int l = 1;
int valF[11451];
int valSP[11451]; // SizePrime
int vis[11451];
int p[11451];set<int> s[11451];
int f[11451];
void DW(){
for(int i=2;i<=w;i++){
if(w % i == 0) {
LW[top] = i;
while(w % i == 0) w /= i,TW[top] ++;
top++;
}
}
} // Deal with W .
void init(){
for(int i=1;i<=10000;i++) {
for(int j=1;i*j <= 10000;j++) {
valF[j*i] ++;
}
}
for(int i=2;i<=10000;i++){
if(vis[i]) continue;
for(int j=1;i*j<=10000;j++){
valSP[i*j]++;
vis[i*j] = 1;
}
}
}
bool ZC(int base,int L){
if(p[L]%base == 0) return true;
if(s[L].find(base) != s[L].end()) return true;
return false;
}
int GS(int L) {return valSP[p[L]] + s[L].size();}
int main(){
scanf("%d%d",&n,&w);
DW();
init();
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
f[i] = valF[p[i]];
}
while(l != top){
int tmpA = 0,tmpP = 0;
bool op = 1;
int k = LW[l];
for(int i=1;i<=n;i++){
int nxtA = 0;
if(ZC(k,i)) {
nxtA = f[i] / 2;
}
else nxtA = f[i],op = 0;
if(tmpP == 0 || (double)nxtA / f[i] > (double) tmpA / f[tmpP]) {
tmpA = nxtA;
tmpP = i;
}
}
if(!op) s[tmpP].insert(k);
f[tmpP] += tmpA;
TW[l] --;
if(TW[l] == 0) l++;
}
long long res = 1;
for(int i=1;i<=n;i++) res *= f[i],res %= 998244353;
printf("%lld",res);
return 0;
}