time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Input
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.
Output
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.
Examples
Input
2
2 3
Output
2
3 2
Input
2
2 2
Output
1
2
Input
3
2 1 1
Output
3
1 1 2
Input
2
83 14
Output
2
14 83
這道題WA了好多次,真是太丟人了。
解題思路:本題是鴿巢原理的簡單運用,假設A是一個子序列,裏面含有三個元素a,b,c,那麼肯定有兩個元素的奇偶性相同,那麼對於兩個奇偶性相同元素來說,和一定不是素數(除了1+1)。所以對於超過兩個1的序列來說,所有1都在這個子序列裏,我們只需再找一個x,滿足x+1是個素數就行。而對於1的個數<=1的來說我們就需要來進行枚舉判斷。
#include <bits/stdc++.h>
using namespace std;
int a[1010];
int n;
bool is_prime(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
return false;
}
return true;
}
int main()
{
scanf("%d",&n);
int num[1010];
int p = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==1)
num[p++] = 1;
}
sort(a,a+n);
//int vis[1000010];
//memset(vis,0,sizeof(vis));
if(p>1)
{
for(int i=p;i<n;i++)
{
if(is_prime(a[i]+1))
{
num[p++] = a[i];
break;
}
}
}
else if(p==1)
{
for(int i=1;i<n;i++)
{
if(is_prime(a[i]+1))
{
num[p++] = a[i];
break;
}
}
if(p==1)
{
int m=0;
int b=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(is_prime(a[i]+a[j]))
{
m = a[i];
b = a[j];
break;
}
}
}
if(m!=0)
{
p = 0;
num[p++] = m;
num[p++] = b;
}
}
}
else
{
int flag = 0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(is_prime(a[i]+a[j]))
{
num[p++] = a[i];
num[p++] = a[j];
flag = 1;
break;
}
}
if(flag)
break;
}
if(p==0)
{
num[p++] = a[0];
}
}
printf("%d\n",p);
for(int i=0;i<p;i++)
{
if(i==p-1)
printf("%d\n",num[i]);
else
printf("%d ",num[i]);
}
return 0;
}