#if 0
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
/* 素数:大于1的质数,即只能被1和它本身整除 */
bool primeNums(int first, int second)
{
int sum = first + second;
bool flag = true;
if(sum == 1 || sum == 2) {
return false;
}
//sqrt是开平方的函数,举个简单的例子:sqrt(4) = 2; sqrt(9) = 3;
for(int i = 2; i <= sqrt(sum); i++) {
if(sum % i == 0) { //非素数
flag = false;
break;
}
}
return flag;
}
/*
* 递归排列查找素数伴侣
* 思想:对输入的数组进行排序,对2个数据为一对数据相加的和是否为素数,若为素数,则素数伴侣个数count加1,
* 如果素数伴侣最大值maxx小于count,则count赋值于maxx;对数组进行递归排序
* 步骤:
* 第一步:输入数组个数和数组值
* 第二步:对数组进行排序sort
* 第三步:遍历查找一对数据的和是否为素数伴侣,若为素数,则素数伴侣个数count加1;
如果素数伴侣最大值maxx小于count,则count赋值于maxx;
循环对数组进行递归排序next_permutation
*/
int maxPrimeMate(int *inputVec, int num)
{
int maxValue = 0;
sort(inputVec, inputVec+num);
do {
int count = 0;
for(int i = 0; i < num; i+=2) {
if(primeNums(inputVec[i], inputVec[i+1])) {
count++;
}
}
if(maxValue < count) {
maxValue = count;
}
} while(next_permutation(inputVec, inputVec+num)); //下一组排列
return maxValue;
}
int main()
{
int num;
while(cin>>num) {
int maxValue = 0;
int *inputVec = new int[num];
for(int i = 0; i < num; i++) {
cin>>inputVec[i];
}
if(num % 2 == 0) {
maxValue = maxPrimeMate(inputVec, num);
cout<<maxValue<<endl;
} else {
cout<<maxValue<<endl;
}
delete inputVec;
}
return 0;
}
#else
#include <bits/stdc++.h>
using namespace std;
//判断一个数是否为素数
bool IsPrimer(int sum)
{
bool flag = true;
if(sum == 1 || sum == 2) {
return false;
}
//sqrt是开平方的函数,举个简单的例子:sqrt(4) = 2; sqrt(9) = 3;
for(int i = 2; i <= sqrt(sum); i++) {
if(sum % i == 0) { //非素数
flag = false;
break;
}
}
return flag;
}
//匈牙利算法,为某一个目标奇数找到它的素数伴侣(偶数),皆以下标表示
bool FindMate(const int& n, vector<vector<bool>>& map, vector<int>& match, vector<bool> &vis)
{
for (int i = 0; i < match.size(); i++)
{
if (!vis[i] && map[i][n])//偶数未被访问过并且能与目标奇数组成素数(有关系)
{
vis[i] = true;
if (match[i] == -1 || FindMate(match[i], map, match, vis))//当前偶数没有匹配或能给被抛弃的奇数找到新的偶数
{
match[i] = n;//找到这个偶数
return true;
}
}
}
return false;
}
int main()
{
int num = 0;
while (cin >> num)
{
int count = 0;//匹配对数
vector<int> even;//偶数
vector<int> odd;//奇数
int val = 0;
//读取数据
for (int i = 0; i< num; i++)
{
cin >> val;
if (val % 2 == 0) { //偶数
even.push_back(val);
} else { //奇数
odd.push_back(val);
}
}
if (odd.empty() || even.empty())
{
cout << count << endl;
continue;
}
//建立关系表,图中的边
vector<vector<bool>> map(even.size(), vector<bool>(odd.size(), false));
for (int i = 0; i < even.size(); i++)
{
for (int j = 0; j < odd.size(); j++)
{
if (IsPrimer(even[i] + odd[j])) //对素数进行判断
{
map[i][j] = true;
}
}
}
if(num % 2 == 0) {
//建立初始匹配表
vector<int> match(even.size(), -1);
//为每一个奇数都尝试去找对应的偶数,
for (int i = 0; i < odd.size(); i++)
{
vector<bool> vis(even.size(), false);//每一次查找都相当于重新分配,标志要清零
if (FindMate(i, map, match, vis))
{
count++;
}
}
cout << count << endl;
} else {
cout << count << endl;
}
}
}
#endif