665D Simple Subset

D. Simple Subset
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;
}


發佈了70 篇原創文章 · 獲贊 47 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章