//思路:
//先打个素数表, 然后 在记录每个数出现的次数,然后在用两个for遍历a[i]+a[j]的每一种情况
//如果不是素数就跳过
//当i和j相等的时候说明他们指的同一个数,假设这个数出现了n次,那么会有n*(n-1)中组合
//如果二者不同的话会有n*n种选择
#include<iostream>
#include<map>
#include<set>
using namespace std;
const int N=1e5 + 10;
map<int ,int>mp;
set<int>se;
set<int >::iterator it;
int arr[N];
int a[N];
int prime[210]={1,1,0};
int pow(){
for(int i=0;i*i<=200;i++)
if(prime[i]==0){
for(int j=i+i;j<=200;j+=i)
prime[j]=1;
}
}
int main(){
pow();
int n;
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
mp[x]++;//key为值,value为该数出现的次数
se.insert(x);
}
int pos=0;
for(it=se.begin();it!=se.end();it++){
a[pos++]=*it;
}
int sum=0;
for(int i=0;i<pos;i++){
for(int j=0;j<pos;j++){
if(!prime[a[i]+a[j]]){
if(i==j){
sum+=mp[a[i]]*(mp[a[i]]-1);
}
else sum+=mp[a[i]]*mp[a[j]];
}
}
}
cout<<sum<<endl;
return 0;
}