//题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数。
//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以再取一个偶数(如果这个偶数+1是质数)。没有1,如果取了一个奇质数,那只能再拿一个2(如果有2的话)。
坑:一度把题目记错了,以为输入的是质数,结果比赛的时候一直wa到orz
ac代码:
#include<iostream> #include<stdio.h> #include<string> #include<algorithm> using namespace std; const int maxn = (1e6 + 5) * 2; const int mod = 1e9 + 7; int isp[maxn]; int p[1005]; void setp() { for (int i = 1; i <= maxn; i++)isp[i] = 1; isp[1] = 0; for (int i = 2; i*i <= maxn; i++)if (isp[i]) { int x = i; while (x*i <= maxn) { isp[x*i] = 0; x++; } } } int main() { int n; cin >> n; int cnt = 0, c2 = 0; setp(); //for(int i=1;i<=5;i++)if(isp[i])cout<<i<<' '; for (int i = 1; i <= n; i++) { cin >> p[i]; if (p[i] == 1)cnt++; if (p[i] == 2)c2 = 1;//题目记错了 } if (cnt >= 2) { //cout << cnt + c2 << endl; int tmp=0; for (int i = 1; i <= n; i++)if (p[i] % 2 == 0) { if (isp[p[i] + 1])tmp = p[i]; } if (tmp==0)cout << cnt; else cout << cnt + 1; cout << endl; while (cnt--)cout << 1 << ' '; if (tmp)cout << tmp; cout << endl; //if (c2)cout << 2; } else { sort(p + 1, p + n + 1); for (int i = 1; i<n; i++) { for (int j = i + 1; j <= n; j++) { if (isp[p[i] + p[j]]) { printf("%d %d %d", 2, p[i], p[j]); return 0; } } } int okk = 0; for (int i = 1; i <= n; i++)if (isp[p[i]]) { okk = p[i]; break; } if (okk) printf("%d %d", 1, okk); else cout << 1 << endl, cout << p[1];//莫名其妙的一句,忘了当时为啥加的 } }