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; }