bool IsInvalid (int i) { return i == -1; }
void sieve_prime(vector<int> &prims)
{
prims.reserve(50000);
for(unsigned i = 2; i < 50001; i ++)
{
prims.push_back(i);
}
int sieveCnt = 1;
int strtPrim = 2;
while(sieveCnt > 0)
{
//printf("\n-- Prime base: %d --\n", strtPrim);
sieveCnt = 0;
for(unsigned j = 0; j < prims.size(); j++)
{
if(prims[j] % strtPrim == 0 && prims[j] != strtPrim && prims[j] != -1)
{
//printf("\t%d", prims[j]);
prims[j] = -1;
sieveCnt ++;
}
}
//printf("\n-- Sieved cnt: %d\n", sieveCnt);
if(sieveCnt > 0)
{
prims.erase(std::remove_if(prims.begin(), prims.end(), IsInvalid), prims.end());
}
// Find next prim: use upper_bound
vector<int>::iterator it = std::upper_bound (prims.begin(), prims.end(), strtPrim);
if(it == prims.end()) break;
else strtPrim = *it;
}
}