#include<stdio.h>
#include<math.h>
void ad(int *a,int *b){
int i,t=0;
for(i=1;i<=a[0] || i<=b[0] || t ;i++){
t+=a[i]+b[i];
a[i]=t%10;
t/=10;
}
a[0]=i-1;
}
void inm1(int *a,int b){
int i,t=0;
for(i=1;i<=a[0] || t ;i++){
t+=a[i]*b;
a[i]=t%10;
t/=10;
}
a[0]=i-1;
}
void sc(int *A,int *B){
int i,t=0;
for(i=1;i<=A[0];i++){
if(t){
t=0;
if(A[i]>=1)
A[i]-=1;
else{
t=1;
A[i]=A[i]+10-1;
}
}
if(A[i]>=B[i])
A[i]-=B[i];
else{
t=1;
A[i]=A[i]+10-B[i];
}
}
int aux=0;
for(i=1;i<=A[0];i++)
if(A[i])
aux=i;
A[0]=aux;
}
int UNU[11111]={1,1,0,0,},aux2,res[1115],AA[1105],l,ok2,aux,ok,d,m,p,i,v[1111],max,j;
char ap[1111],t[1111];
int P[1111],A[1106];
int n,a[1010],nrf;
int main(){
FILE *f=fopen("indep.in","r");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++){
fscanf(f,"%d",&v[i]);
if(v[i]>max)
max=v[i];
}
fclose(f);
for(i=1;i<=max;i++){
for(j=1;j<=n;j++){
if(!(v[j]%i))
a[i]++;
}
}
for(i=2;i<=1001;i++){
if(!t[i])
for(j=i+i;j<=1001;j+=i)
t[j]=1;
}
p=0;
for(i=2;i<=1001;i++)
if(!t[i]){
p++;
P[p]=i;
}
for(i=1;i<=max;i++){
if(a[i]){
nrf=0;
aux=i;
ok=1;
d=1;
m=0;
while(aux!=1&&d<p){
ok2=1;
m=0;
while(!(aux%P[d])){
if(ok2)
nrf++;
m++;
aux/=P[d];
}
if(m>1){
ok=0;
break;
}
d++;
}
if(ok){
if(aux>1)
nrf++;
if(nrf%2==1){
A[0]=1;
A[1]=1;
for(l=2;l<=1000;l++){
A[l]=0;
AA[l]=0;
}
for(l=1;l<=a[i];l++)
inm1(A,2);
AA[1]=AA[0]=0;
// aux2=a[i];
// while(aux2!=0){
// AA[0]++;
// AA[AA[0]]=aux2%10;
// aux2/=10;
// }
//a[i]
sc(A,UNU);
//sc(A,AA);
sc(res,A);
}
else{
A[0]=1;
A[1]=1;
for(l=2;l<=1000;l++){
A[l]=0;
AA[l]=0;
}
AA[1]=AA[0]=0;
for(l=1;l<=a[i];l++)
inm1(A,2);
sc(A,UNU);
// aux2=a[i];
//while(aux2){
// AA[0]++;
// AA[AA[0]]=(aux2%10);
// aux2/=10;
//}
//sc(A,AA);
ad(res,A);
}
}
}
}
FILE *g=fopen("indep.out","w");
for(i=res[0];i>=1;i--){
fprintf(g,"%d",res[i]);
}
if(res[0]==0)
fprintf(g,"%d",0);
fclose(g);
return 0;
}