標籤:style http os io for re
Summation of Four Primes
題目連結:click here~
題目要求:
給出一個整數要你將其拆成由四個素數組成的數。如果,不能拆則輸出“Impossible.”
思路解析:
根據題目給出的兩個猜想,可以得到。如果,一個數是奇數的話則其一定可以拆成一個奇數+一個偶數的形式,而一個數是偶數的話可拆的就有兩種奇數+奇數/偶數+偶數。而Waring的猜想是一個奇數可以拆成3個素數,所以顯然題目給出的一個整數是奇數的時候我們就不能保留奇數拆偶數了。我們應該一開始就把奇數拆成兩個素數,然後再拆偶數,而一個偶數可以拆成兩個素數是猜想給出的,所以我們可以認為其實正確的。同理,當給出的數是偶數的時候,我們只能是保留兩個偶數的形式,且可以一開始就把一個偶數給拆成兩個素數的形式。然後,遍曆另外一個偶數。而一個為n的整數內的素數個數為n/ln(n)。所以,演算法總時間為O(n/ln(n));
#include <iostream>#include <algorithm>#include <vector>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int MAXN = 10000000+10;int top,prim[700000];bool vst[MAXN];void Isprim(){ top = 0; memset(vst,0,sizeof(vst)); vst[0] = vst[1] = 1; for(int i = 2;i < MAXN;++i)if(!vst[i]){ prim[top++] = i; for(int j = i+i;j < MAXN;j += i)vst[j] = 1; }}void output(int n){ for(int i = 0;i < top&&prim[i] < n;++i){ if(!vst[n-prim[i]]){ cout<<prim[i]<<" "<<n-prim[i]<<endl; break; } }}int main(){ Isprim(); //test// cout<<"top: "<<top<<endl; int n; while(cin>>n) { if(n<8){ cout<<"Impossible."<<endl; continue; } if(n&1){ cout<<"2 "<<"3 "; n -= 5; output(n); } else{ cout<<"2 "<<"2 "; n -= 4; output(n); } } return 0;}