#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COUNT 100
int oddCount = 0;
int evenCount = 0;
bool isprime(int figure);
void buildNetwork(int odds[], int evens[]);
int M[MAX_COUNT];
bool used[MAX_COUNT];
int network[MAX_COUNT][MAX_COUNT];
int odds[MAX_COUNT]; //奇数
int evens[MAX_COUNT]; //偶数
int findp(int j) {
for (int i = 0; i < oddCount; i++) {
if (network[i][j] == 1 && (used[i] == 0)) {
used[i] = 1;
if (M[i] == -1 || findp(M[i])) {
M[i] = j;
return 1;
}
}
}
return 0;
}
int main() {
int i, n, figure;
scanf("%d", &n);
memset(odds, -1, sizeof(odds));
memset(evens, -1, sizeof(evens));
for (i = 0; i < n; i++) {
scanf("%d", &figure);
if (figure % 2 == 0) {
evens[evenCount++] = figure;
} else {
odds[oddCount++] = figure;
}
}
buildNetwork(odds, evens);
memset(M, -1, sizeof(M));
int sum = 0;
for (i = 0; i < evenCount; i++) {
memset(used, 0, sizeof(used));
sum = sum + findp(i);
}
printf("%d", sum);
return 0;
}
bool isprime(int figure) {
int i;
for (i = 2; i * i <= figure; i++) {
if (figure % i == 0) {
return false;
}
}
return true;
}
void buildNetwork(int odds[], int evens[]) {
int i, j;
int figure;
for (i = 0; i < oddCount; i++)
for (j = 0; j < evenCount; j++) {
figure = odds[i] + evens[j];
if (isprime(figure)) {
network[i][j] = 1;
}
}
}