#include<stdio.h>
#include<string.h>
#define Max 100
FILE*f=fopen("factoriale.in","r");
FILE*g=fopen("factoriale.out","w");
int x[105],n,k;
int u[104],p;
int a[104];
int frecv[103];
int sol[100004];
int aux[100005];
void read()
{
fscanf(f,"%d %d",&n,&k);
int i;
for(i=1;i<=n;++i) fscanf(f,"%d",&x[i]);
}
void precalc()
{
int i,j;
for(i=2;i<=Max;i+=2) u[i]=1;
a[1]=2;
p=1;
for(i=3;i<=Max;i+=2)
{
if(u[i]==0)
{
a[++p]=i;
for(j=2;i*j<=Max;u[i*j]=1,++j);
}
}
}
int bug(int a[], int n)
{
int i;
for(i=1;i<=n;++i) fprintf(g,"%d ",a[i]);
fprintf(g,"\n");
}
int descomp(int n, int p) //puterea la care apare p in n!
{
int nr=0,pr=p;
while((n/pr)!=0)
{
nr=nr+n/pr;
pr*=p;
}
return nr;
}
void calcul()
{
int nr,i,j;
for(i=1;i<=n;++i)
for(j=1;j<=p;++j)
{
nr=descomp(x[i],a[j]);
frecv[j]+=nr;
}
}
void inmulteste(int a[], int b)
{
int i,t=0;
for(i=1;i<=a[0]||t;++i,t/=10)
{
a[i]=(t+=a[i]*b)%10;
}
a[0]=i-1;
}
void inmultire(int A[], int B[])
{
int i, j, t, C[100000];
memset(C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=10)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
void det_sol()
{
int i,j;
sol[0]=sol[1]=1;
for(i=1;i<=p;++i)
if(frecv[i]!=0 && frecv[i]%k!=0)
{
//sol=sol*(a[i]^(k-frecv[i]%k))
memset(aux,0, sizeof(aux));
aux[0]=aux[1]=1;
for(j=1;j<=k-frecv[i]%k;++j)
inmulteste(aux,a[i]);
inmultire(sol,aux);
}
}
void afis()
{
int i,j;
for(i=sol[0];i>0;--i) fprintf(g,"%d",sol[i]);
}
int main()
{
read();
precalc();
calcul();
det_sol();
afis();
return 0;
}