题目大意:给你一个N个数的序列,找到一个子序列,子序列满足:元素个数尽可能多且任意两个元素的和为素数。输出的序列中的数可以是任意的,如果有多个符合题意,则随便输出一个序列,最坑的是如果没有则随便输出一个数。
思路:任何一个序列,里面有奇数也有偶数,因此想找到更多的元素,只需要判断1的个数。
AC代码:
#include<stdio.h>
#include<algorithm>
#define N 2000005
#include<string.h>
using namespace std;
int prime[N];
int main()
{
int n,a[1005];
for(int i=0;i<N;i++)
prime[i]=1;
for(int i=2;i<N;i++)//打表判断是否为素数
{
if(prime[i]==0)
continue;
for(int j=2;i*j<N;j++)
prime[i*j]=0;
}
while(~scanf("%d",&n))
{
memset(a,0,sizeof(0));
int flag=0,ans=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i]==1)
ans++;//找出一的个数
}
stable_sort(a,a+n);
if(ans<2)
{
int flag=0;
for(int i=0;i<n&&!flag;i++)
{
for(int j=i+1;j<n&&!flag;j++)
{
//判断两个数的和是否为素数
if(prime[a[i]+a[j]])
{//是,标记,输出这两个数
printf("2\n%d %d\n",a[i],a[j]);
flag=1;
break;
}
}
}
if(flag==0)//不是,随便输出一个数
printf("1\n%d\n",a[0]);
}
else
{
int flag=0;
for(int i=0;i<n&&!flag;i++)
{
//判断不是一的数加一是否为素数
if(prime[a[i]+1]&&a[i]!=1)
{
printf("%d\n%d ",ans+1,a[i]);
flag=1;
break;
}
}
if(flag==0)
printf("%d\n",ans);
for(int i=0;i<ans-1;i++)
printf("1 ");
printf("1\n");
}
}
return 0;
}