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