10168:Summation of Four Primes

問題文
http://uva.onlinejudge.org/external/101/10168.html

nを4つの素数の和で表す。その表し方のうちの一つを出力せよ。不可能な場合は"Impossible."と出力せよ。
























http://ja.wikipedia.org/wiki/%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%90%E3%83%83%E3%83%8F%E3%81%AE%E4%BA%88%E6%83%B3
ゴールドバッハの予想
この問題の範囲でなら正しいことが確かめられている。

4以上の偶数はすべて2つの素数の和で表すことができる。つまり4+2+2=8以上のすべての偶数は4つの素数の和で表すことができる。また、4+2+3=9以上のすべての奇数も4つの素数の和で表すことができる。つまり、

n<8 のとき"Impossible"
7

#include<iostream>
#include<algorithm>
#include<vector>
 
#define N 10000001
 
using namespace std;
 
int main(void){
    static bool prime[N];
     
    fill(prime,prime+N,true);
    prime[0]=prime[1]=false;
     
    for(int i=2;i*i<N;i++)
        if(prime[i])for(int j=2*i;j<N;j+=i)prime[j]=false;
     
    vector<int>p;
    for(int i=2;i<N;i++)if(prime[i])p.push_back(i);
     
    int n;
    while(cin >> n){
        if(n<8){cout << "Impossible." << endl; continue;}
         
        if(n%2==0)cout << 2 << " " << 2 << " ",n-=4;
        else cout << 2 << " " << 3 << " ",n-=5;
         
        for(int i=0;i<p.size();i++){
            if(binary_search(p.begin(),p.end(),n-p[i])){
                cout << p[i] <<" " << n-p[i] << endl;
                break;
            }
        }   
    }
    return 0;
}