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
It has been a long day from my last blog. 人生莫名其妙地改变了轨迹……总之又开始做一些题了。今后的文章大多都并不是为了提供题解而写,而是为了提醒自己一些写法、算法、数据结构之类的,可能经过数次修改,并不漂亮而且可能有并不恰当的地方。
这道题其实脑补数学规律挺简单的,但之后的判定挺麻烦的。复习了素数筛法和二分。
#include
#include
#include
#include
#include
#include
using namespace std;
int n,a[1005],ct,pri[200002],mn[2000002],zz,ji,ou;
void init()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]==1) ct++;
else if(a[i]%2==1) ji++;
else ou++;
}
}
void prime()
{
int i,j;
for(i=2;i<=2000000;i++){
if(!mn[i]) {pri[++zz]=i; mn[i]=i;}
for(j=1;j<=zz,pri[j]*i<=2000000;j++){
mn[pri[j]*i]=pri[j];
if(i%pri[j]==0) break;
}
}
}
bool check(int x)
{
int l=1,r=zz,mid;
while(l>1;
if(pri[mid]