题目背景

1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。

这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。

从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。

题目描述

现在请你编一个程序验证哥德巴赫猜想。

先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。

输入输出格式

输入格式:

 

仅有一行,包含一个正奇数n,其中9<n<20000

 

输出格式:

 

仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。

 

输入输出样例

输入样例#1: 复制


2009


输出样例#1: 复制


3 3 2003


唉式筛:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <cstring>
#include <stack>
#include <vector>
#include <queue>
#define Swap(a,b) a ^= b ^= a ^= b
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std ;
typedef long long LL;
const int N = 1e7+10 ;
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
const int MAX = 2000;
const int inf = 0xffffff;
const LL mod = 1e9+7 ;
// 唉式素数打表
int prime[N] ; // 第i 个素数
bool is_prime[N];
int sieve(int n ){
int cnt = 0 ;
for(int i = 0 ; i<=n+1 ;i++){
is_prime[i] = true;
}
is_prime[0] = is_prime[1] = false ;
for(int i = 2 ; i<=n ;i++){
if(is_prime[i]){
prime[cnt++] = i ;
for(int j = 2*i;j<=n;j+=i){
is_prime[j] = false ;
}
}
}
return cnt ; // 返回 n 以内素数个数
}

bool isprime(int x ){
if(x == 1 ){
return false ;
}
else if(x == 2){
return true ;
}
else{
for(int i = 2 ; i*i<=x ;i++){
if(x%i== 0 ){
return false ;
}
}
}
return true ;
}
int P_numbers[N] ;
//线性筛
int euler(int n){
int cnt = 0 ;
prime[0] = prime[1] = 0 ;
for(int i = 2 ; i<=n ; i++) prime[i] = 1 ;
for(int i = 2 ;i<=n; i++ ){
if(prime[i]){
P_numbers[cnt++] = i ;
}
for(int j = 0 ;j<cnt && i*P_numbers[j]<n ;j++){
prime[i*P_numbers[j]] = 0 ;
if(i% P_numbers[j] == 0){
break ;
}
}
}
return cnt ;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);

int n ;
cin >> n ;

int k = sieve(n) ;

for(int i = 0; i<k ; i++ ){
for(int j = i ; j<k ;j++ ){
if(is_prime[n-(prime[i]+prime[j])])
{
cout<<prime[i]<<" "<<prime[j]<<" "<<n-(prime[i]+prime[j])<<endl;
return 0 ;
}
}
}

return 0;
}