题目大意:给出一个数n,现在我们需要用1到3个素数,使它们的和等于n,求任意一种方案
分析:瞎暴力会超时...看了别人的题解后,才知道居然要用哥德巴赫猜想。传送门http://www.cnblogs.com/HarryGuo2012/p/4858620.html
先找到离n最近的那个比它小的素数,然后由哥德巴赫猜想可知,一个偶数必定等于两个素数之和。
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <set>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
bool check(int x) {
for(int i = 2; i*i <= x; i++)
if(x%i == 0) return false;
return true;
}
int main() {
scanf("%d", &n);
if(check(n)) {
printf("1\n%d", n);
return 0;
}
for(int i = n; i > 0 ; i--) {
if(check(i)) {
int j = n-i;
if(check(j)) {
printf("2\n%d %d\n", i, j);
return 0;
}
for(int k = j-2; k > 0; k--)
if(check(k) && check(j-k)) {
printf("3\n%d %d %d\n", i, k, j-k);
return 0;
}
}
}
return 0;
}