A tuple of positive integers {x1, x2, ..., xk} is called simple if for all pairs of positive integers (i, j) (1 ≤ i < j ≤ k), xi + xj is a prime.
You are given an array a with n positive integers a1, a2, ..., an (not necessary distinct). You want to find a simple subset of the array a with the maximum size.
A prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself.
Let's define a subset of the array a as a tuple that can be obtained from a by removing some (possibly all) elements of it.
The first line contains integer n (1 ≤ n ≤ 1000) — the number of integers in the array a.
The second line contains n integers ai (1 ≤ ai ≤ 106) — the elements of the array a.
On the first line print integer m — the maximum possible size of simple subset of a.
On the second line print m integers bl — the elements of the simple subset of the array a with the maximum size.
If there is more than one solution you can print any of them. You can print the elements of the subset in any order.
2 2 3
2 3 2
2 2 2
1 2
3 2 1 1
3 1 1 2
2 83 14
2 14 83
#include<iostream>
#include<algorithm>
#include<string.h>
#include<ctype.h>
using namespace std;
const int maxn=10000;
int a[maxn+5];
bool isprime(int x)
{
if(x==0||x==1) return 0;
if(x==2) return 1;
int m=sqrt(x)+1;
for(int i=2;i<m;i++)
{
if(x%i==0) return 0;
}
return 1;
}
int pos[maxn];
int main()
{
int n,cnt1;
cnt1=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==1) cnt1++;
}
if(cnt1>=2)
{
for(int i=0;i<=n;i++)
{
if(i==n)
{
printf("%d\n",cnt1);
for(int j=1;j<=cnt1;j++)
{
printf(" 1");
}
break;
}
if(a[i]==1);
else if(isprime(a[i]+1))
{
printf("%d\n",cnt1+1);
printf("%d",a[i]);
for(int j=1;j<=cnt1;j++)
{
printf(" 1");
}
break;
}
}
}
else
{
int f=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(isprime(a[i]+a[j]))
{
f=1;
printf("2\n");
printf("%d %d\n",a[i],a[j]);
break;
}
}
if(f) break;
}
if(f==0)
{
printf("1\n");
printf("%d\n",a[0]);
}
}
}