#include <iostream>
#include <cmath>
#define MAX 1<<25
using namespace std;
bool bits[MAX];
int count_primes(int until, int step) {
until++;
int n = (until - 3) / 2;
int limit = (int)sqrt(n);
for (int b = 0; b < n; b += step)
{
int end = min(n, b + step);
for (int i = 0; i < limit; i++)
{
int k = i * 2 + 3;
int kk = (k * k - 3) / 2;
int start = (b-i) / k * k + i;
if (start < b) start += k;
if (start < kk) start = kk;
if (!bits [i]) {
for (int j = start; j < end; j += k)
bits [j] = true;
}
}
}
int count = 1; //2 pre-counted
for (int i = 0; i < n; i++)
if (!bits[i]) count++; //the prime is i*2+3
return count;
}
int main() {
clock_t begin_time = clock();
cout << "NĂºmero de primos: " << count_primes(1<<25, 1<<16) << endl;
cout << "Segundos: " << double( clock () - begin_time ) / CLOCKS_PER_SEC << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNkZWZpbmUgTUFYIDE8PDI1CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGJpdHNbTUFYXTsKCmludCBjb3VudF9wcmltZXMoaW50IHVudGlsLCBpbnQgc3RlcCkgewogICAgdW50aWwrKzsKCWludCBuID0gKHVudGlsIC0gMykgLyAyOwoJaW50IGxpbWl0ID0gKGludClzcXJ0KG4pOwoKCWZvciAoaW50IGIgPSAwOyBiIDwgbjsgYiArPSBzdGVwKQoJewoJCWludCBlbmQgPSBtaW4obiwgYiArIHN0ZXApOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykKCQl7CgkJCWludCBrID0gaSAqIDIgKyAzOwoJCQlpbnQga2sgPSAoayAqIGsgLSAzKSAvIDI7CgoJCQlpbnQgc3RhcnQgPSAoYi1pKSAvIGsgKiBrICsgaTsKCQkJaWYgKHN0YXJ0IDwgYikgc3RhcnQgKz0gazsKCQkJaWYgKHN0YXJ0IDwga2spIHN0YXJ0ID0ga2s7CgoJCQlpZiAoIWJpdHMgW2ldKSB7CgkJCQlmb3IgKGludCBqID0gc3RhcnQ7IGogPCBlbmQ7IGogKz0gaykKCQkJCQliaXRzIFtqXSA9IHRydWU7CgkJCX0KCQl9Cgl9CglpbnQgY291bnQgPSAxOyAvLzIgcHJlLWNvdW50ZWQKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCWlmICghYml0c1tpXSkgY291bnQrKzsgLy90aGUgcHJpbWUgaXMgaSoyKzMKCXJldHVybiBjb3VudDsJCn0KCmludCBtYWluKCkgewogICAgY2xvY2tfdCBiZWdpbl90aW1lID0gY2xvY2soKTsKCiAgICBjb3V0IDw8ICJOw7ptZXJvIGRlIHByaW1vczogIiA8PCBjb3VudF9wcmltZXMoMTw8MjUsIDE8PDE2KSA8PCBlbmRsOwogICAgY291dCA8PCAiU2VndW5kb3M6ICIgPDwgZG91YmxlKCBjbG9jayAoKSAtIGJlZ2luX3RpbWUgKSAvICBDTE9DS1NfUEVSX1NFQyA8PCBlbmRsOwp9