#include <iostream>
#include <vector>
using namespace std;
class SumTwoPrimes
{
private:
size_t n;
vector<size_t> primes,lows;
public:
SumTwoPrimes(size_t n):n(n)
{
PrimesOver2();
SumPrimes();
primes.resize(0);
}
size_t oposite(size_t p)const { return n-p; }
const vector<size_t> &list()const { return lows; }
protected:
void PrimesOver2()
{
vector<bool> bin(n+1);
for(size_t i=3;i<=n;i+=2)
{
if(!bin[i])
{
primes.push_back(i);
for(size_t k=i<<1;k<=n;k+=i) bin[k]=true;
}
}
}
void SumPrimes()
{
for(int fr=0,bk=primes.size()-1;fr<=bk;)
{
size_t pfr=primes[fr],sum=pfr+primes[bk];
if(sum>n) --bk;
else if(sum<n) ++fr;
else
{
lows.push_back(pfr);
++fr;
--bk;
}
}
}
};
int main()
{
SumTwoPrimes stp(1000);
for(auto p:stp.list()) cout<<p<<" + "<<stp.oposite(p)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU3VtVHdvUHJpbWVzCnsKCXByaXZhdGU6CglzaXplX3QgbjsKCXZlY3RvcjxzaXplX3Q+IHByaW1lcyxsb3dzOwoJcHVibGljOgoJU3VtVHdvUHJpbWVzKHNpemVfdCBuKTpuKG4pIAoJewoJCVByaW1lc092ZXIyKCk7CgkJU3VtUHJpbWVzKCk7CgkJcHJpbWVzLnJlc2l6ZSgwKTsKCX0KCXNpemVfdCBvcG9zaXRlKHNpemVfdCBwKWNvbnN0IHsgcmV0dXJuIG4tcDsgfQoJY29uc3QgdmVjdG9yPHNpemVfdD4gJmxpc3QoKWNvbnN0IHsgcmV0dXJuIGxvd3M7IH0KCXByb3RlY3RlZDoKCXZvaWQgUHJpbWVzT3ZlcjIoKQoJewoJCXZlY3Rvcjxib29sPiBiaW4obisxKTsKCQlmb3Ioc2l6ZV90IGk9MztpPD1uO2krPTIpCgkJewoJCQlpZighYmluW2ldKQoJCQl7CgkJCQlwcmltZXMucHVzaF9iYWNrKGkpOwoJCQkJZm9yKHNpemVfdCBrPWk8PDE7azw9bjtrKz1pKSBiaW5ba109dHJ1ZTsKCQkJfQoJCX0KCX0KCXZvaWQgU3VtUHJpbWVzKCkKCXsKCQlmb3IoaW50IGZyPTAsYms9cHJpbWVzLnNpemUoKS0xO2ZyPD1iazspCgkJewoJCQlzaXplX3QgcGZyPXByaW1lc1tmcl0sc3VtPXBmcitwcmltZXNbYmtdOwoJCQlpZihzdW0+bikgLS1iazsKCQkJZWxzZSBpZihzdW08bikgKytmcjsKCQkJZWxzZQoJCQl7CgkJCQlsb3dzLnB1c2hfYmFjayhwZnIpOwoJCQkJKytmcjsKCQkJCS0tYms7CgkJCX0KCQl9Cgl9Cn07CgppbnQgbWFpbigpIAp7CglTdW1Ud29QcmltZXMgc3RwKDEwMDApOwoJZm9yKGF1dG8gcDpzdHAubGlzdCgpKSBjb3V0PDxwPDwiICsgIjw8c3RwLm9wb3NpdGUocCk8PGVuZGw7CglyZXR1cm4gMDsKfQ==