题意:给出n个数,问最多能够找到多少个数使得两两相加是质数.
因为奇数+奇数和偶数+偶数都不可能是质数,所以必然是1个奇数1个偶数,也就是最
多能够选2个.但是1的情况很特殊.所以先统计出1的数量.
如果1的数量大于等于2,直接都拿1;否则暴力枚举奇数和偶数,判断两个数相加是不
是质数.
注意全是奇数或者全是偶数的情况.
#include <bits/stdc++.h>
using namespace std;
#define maxn 1111
int odd[maxn], even[maxn];
int cnt1, cnt2;
int n;
bool is_prime[2111111];
void init () {
memset (is_prime, 1, sizeof is_prime);
is_prime[0] = is_prime[1] = 0;
for (int i = 2; i < 2111111; i++) {
if (is_prime[i]) {
for (int j = i+i; j < 2111111; j += i)
is_prime[j] = 0;
}
}
}
int main () {
init ();
//freopen ("in.txt", "r", stdin);
while (cin >> n) {
cnt1 = cnt2 = 0;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
if (num&1) {
odd[cnt1++] = num;
}
else
even[cnt2++] = num;
}
int cnt = 0;
sort (odd, odd+cnt1);
sort (even, even+cnt2);
for (int i = 0; i < cnt1; i++) if (odd[i] == 1)
cnt++;
int more = 0;
if (cnt >= 2) {
for (int i = 0; i < cnt2; i++) {
if (is_prime[1+even[i]]) {
more = even[i];
cnt++;
break;
}
}
cout << cnt << "\n";
if (more) {
cout << more << " ";
}
cnt -= (more > 0);
for (int i = 0; i < cnt; i++) {
cout << 1 << (i == cnt-1 ? "\n" : " ");
}
continue;
}
for (int i = 0; i < cnt1; i++) {
for (int j = 0; j < cnt2; j++) {
if (is_prime[odd[i]+even[j]]) {
cout << 2 << "\n" << odd[i] << " " << even[j] << "\n";
goto out;
}
}
}
cout << 1 << "\n";
cout << (cnt1 ? odd[0] : even[0]) << "\n";
out: ;
}
return 0;
}