#include<iostream>
#include<vector>
using namespace std;
bool isprime(int num)
{
for(int i = 2; i * i <= num; i++)
if(num % i == 0)return false;
return true;
}
bool find(int index, vector<bool>& used, vector<int>& match, vector<vector<bool>>& map)
{
for(int i = 0; i < used.size(); i++)//遍历每个偶数与奇数比较
if(map[i][index] && !used[i])
{ //直接查询能否构成
used[i] = true;
if(match[i] == -1 || find(match[i], used, match, map))
{ //如果第i个偶数还未配对,或者跟它配对的奇数还有别的选择
match[i] = index; //则配对该数
return true;
}
}
return false;
}
int main()
{
int n;
while(cin >> n)
{
vector<int> odds,evens,nums(n);
for(int i = 0; i < n; i++)
{
cin >> nums[i];
if(nums[i] % 2)odds.push_back(nums[i]);
else evens.push_back(nums[i]);
}
int count = 0;
if(odds.size() == 0 || evens.size() == 0)//缺少奇数或者偶数无法构成素数
{
cout << count << endl;
continue;
}
vector<vector<bool>> map(evens.size(), vector<bool>(odds.size(), false));
for(int i = 0; i < evens.size(); i++)//构建所有能相连的奇数偶数的边
for(int j = 0; j < odds.size(); j++)
if(isprime(evens[i] + odds[j]))
map[i][j] = true;
vector<int> match(evens.size(), -1); //统计每个偶数的配对是哪个奇数
for(int i = 0; i < odds.size(); i++)
{
vector<bool> used(evens.size(), false);
if(find(i, used, match, map))count++;
}
cout << count << endl;
}
}