#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
typedef uint64_t u64;
const uint8_t ONE = 1;
const u64 F30[] = {1,7,11,13,17,19,23,29};
void markNonPrimes(const u64 start, const u64 num, const u64 lcm, const u64 limit, std::vector<uint8_t> &primes)
{
for (u64 k = start; (lcm*k) < limit; k++)
{
u64 K = lcm*k;
if ((primes[k] & (ONE << 0)) && (K+F30[0]) % num == 0)
primes[k] &= ~(ONE << 0);
if ((primes[k] & (ONE << 1)) && (K+F30[1]) % num == 0)
primes[k] &= ~(ONE << 1);
if ((primes[k] & (ONE << 2)) && (K+F30[2]) % num == 0)
primes[k] &= ~(ONE << 2);
if ((primes[k] & (ONE << 3)) && (K+F30[3]) % num == 0)
primes[k] &= ~(ONE << 3);
if ((primes[k] & (ONE << 4)) && (K+F30[4]) % num == 0)
primes[k] &= ~(ONE << 4);
if ((primes[k] & (ONE << 5)) && (K+F30[5]) % num == 0)
primes[k] &= ~(ONE << 5);
if ((primes[k] & (ONE << 6)) && (K+F30[6]) % num == 0)
primes[k] &= ~(ONE << 6);
if ((primes[k] & (ONE << 7)) && (K+F30[7]) % num == 0)
primes[k] &= ~(ONE << 7);
}
}
void getPrimesUpto(u64 limit)
{
const u64 lcm = 30;
std::vector<uint8_t> primes(limit*0.035 + 1,0xff);
u64 k = 1;
u64 n = 0;
u64 count=3-1;
markNonPrimes(k, F30[1], lcm, limit, primes);
markNonPrimes(k, F30[2], lcm, limit, primes);
markNonPrimes(k, F30[3], lcm, limit, primes);
markNonPrimes(k, F30[4], lcm, limit, primes);
markNonPrimes(k, F30[5], lcm, limit, primes);
markNonPrimes(k, F30[6], lcm, limit, primes);
markNonPrimes(k, F30[7], lcm, limit, primes);
while(lcm*k*lcm*k<limit)
{
const u64 K = lcm*k;
if(primes[k] & (ONE<<0))
markNonPrimes(k+1, K+F30[0], lcm, limit, primes);
if(primes[k] & (ONE<<1))
markNonPrimes(k+1, K+F30[1], lcm, limit, primes);
if(primes[k] & (ONE<<2))
markNonPrimes(k+1, K+F30[2], lcm, limit, primes);
if(primes[k] & (ONE<<3))
markNonPrimes(k+1, K+F30[3], lcm, limit, primes);
if(primes[k] & (ONE<<4))
markNonPrimes(k+1, K+F30[4], lcm, limit, primes);
if(primes[k] & (ONE<<5))
markNonPrimes(k+1, K+F30[5], lcm, limit, primes);
if(primes[k] & (ONE<<6))
markNonPrimes(k+1, K+F30[6], lcm, limit, primes);
if(primes[k] & (ONE<<7))
markNonPrimes(k+1, K+F30[7], lcm, limit, primes);
k++;
}
for(u64 k=0; lcm*k < limit; k++ )
{
for(u64 i =0; i<8; i++)
if(primes[k] & ONE<< i && lcm*k+F30[i] < limit) {count++;/*std::cout << lcm*k+F30[i] << " ";*/}
}
std::cout << "\n======\n"<< count << "\n";
}
int main()
{
clock_t start = clock();
getPrimesUpto(1000000);
std::cout << "\nTime: "<< clock() - start << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y3RpbWU+Cgp0eXBlZGVmIHVpbnQ2NF90IHU2NDsKCmNvbnN0IHVpbnQ4X3QgT05FID0gMTsKY29uc3QgdTY0IEYzMFtdID0gezEsNywxMSwxMywxNywxOSwyMywyOX07Cgp2b2lkIG1hcmtOb25QcmltZXMoY29uc3QgdTY0IHN0YXJ0LCBjb25zdCB1NjQgbnVtLCBjb25zdCB1NjQgbGNtLCBjb25zdCB1NjQgbGltaXQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwcmltZXMpCnsKICAgZm9yICh1NjQgayA9IHN0YXJ0OyAobGNtKmspIDwgbGltaXQ7IGsrKykKICAgewogICAgICB1NjQgSyA9IGxjbSprOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgMCkpICYmIChLK0YzMFswXSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDApOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgMSkpICYmIChLK0YzMFsxXSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDEpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgMikpICYmIChLK0YzMFsyXSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDIpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgMykpICYmIChLK0YzMFszXSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDMpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgNCkpICYmIChLK0YzMFs0XSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDQpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgNSkpICYmIChLK0YzMFs1XSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDUpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgNikpICYmIChLK0YzMFs2XSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDYpOwogICAgICBpZiAoKHByaW1lc1trXSAmIChPTkUgPDwgNykpICYmIChLK0YzMFs3XSkgJSBudW0gPT0gMCkKICAgICAgICAgcHJpbWVzW2tdICY9IH4oT05FIDw8IDcpOwogICB9Cn0KCnZvaWQgZ2V0UHJpbWVzVXB0byh1NjQgbGltaXQpCnsKICAgY29uc3QgdTY0IGxjbSA9IDMwOwogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwcmltZXMobGltaXQqMC4wMzUgKyAxLDB4ZmYpOwogICAKICAgdTY0IGsgPSAxOwogICB1NjQgbiA9IDA7CiAgIHU2NCBjb3VudD0zLTE7CiAgIAogICBtYXJrTm9uUHJpbWVzKGssIEYzMFsxXSwgbGNtLCBsaW1pdCwgcHJpbWVzKTsKICAgbWFya05vblByaW1lcyhrLCBGMzBbMl0sIGxjbSwgbGltaXQsIHByaW1lcyk7CiAgIG1hcmtOb25QcmltZXMoaywgRjMwWzNdLCBsY20sIGxpbWl0LCBwcmltZXMpOwogICBtYXJrTm9uUHJpbWVzKGssIEYzMFs0XSwgbGNtLCBsaW1pdCwgcHJpbWVzKTsKICAgbWFya05vblByaW1lcyhrLCBGMzBbNV0sIGxjbSwgbGltaXQsIHByaW1lcyk7CiAgIG1hcmtOb25QcmltZXMoaywgRjMwWzZdLCBsY20sIGxpbWl0LCBwcmltZXMpOwogICBtYXJrTm9uUHJpbWVzKGssIEYzMFs3XSwgbGNtLCBsaW1pdCwgcHJpbWVzKTsKCiAgIHdoaWxlKGxjbSprKmxjbSprPGxpbWl0KQogICB7CiAgICAgIGNvbnN0IHU2NCBLID0gbGNtKms7CiAgICAgIGlmKHByaW1lc1trXSAmIChPTkU8PDApKQogICAgICAgICBtYXJrTm9uUHJpbWVzKGsrMSwgSytGMzBbMF0sIGxjbSwgbGltaXQsIHByaW1lcyk7CiAgICAgICAgIAogICAgICBpZihwcmltZXNba10gJiAoT05FPDwxKSkKICAgICAgICAgbWFya05vblByaW1lcyhrKzEsIEsrRjMwWzFdLCBsY20sIGxpbWl0LCBwcmltZXMpOwogICAgICAgICAKICAgICAgaWYocHJpbWVzW2tdICYgKE9ORTw8MikpCiAgICAgICAgIG1hcmtOb25QcmltZXMoaysxLCBLK0YzMFsyXSwgbGNtLCBsaW1pdCwgcHJpbWVzKTsKICAgICAgICAgCiAgICAgIGlmKHByaW1lc1trXSAmIChPTkU8PDMpKQogICAgICAgICBtYXJrTm9uUHJpbWVzKGsrMSwgSytGMzBbM10sIGxjbSwgbGltaXQsIHByaW1lcyk7CiAgICAgICAgIAogICAgICBpZihwcmltZXNba10gJiAoT05FPDw0KSkKICAgICAgICAgbWFya05vblByaW1lcyhrKzEsIEsrRjMwWzRdLCBsY20sIGxpbWl0LCBwcmltZXMpOwogICAgICAgICAKICAgICAgaWYocHJpbWVzW2tdICYgKE9ORTw8NSkpCiAgICAgICAgIG1hcmtOb25QcmltZXMoaysxLCBLK0YzMFs1XSwgbGNtLCBsaW1pdCwgcHJpbWVzKTsKICAgICAgICAgCiAgICAgIGlmKHByaW1lc1trXSAmIChPTkU8PDYpKQogICAgICAgICBtYXJrTm9uUHJpbWVzKGsrMSwgSytGMzBbNl0sIGxjbSwgbGltaXQsIHByaW1lcyk7CiAgICAgICAgIAogICAgICBpZihwcmltZXNba10gJiAoT05FPDw3KSkKICAgICAgICAgbWFya05vblByaW1lcyhrKzEsIEsrRjMwWzddLCBsY20sIGxpbWl0LCBwcmltZXMpOyAgCgogICAgICBrKys7CiAgIH0KCiAgIGZvcih1NjQgaz0wOyBsY20qayA8IGxpbWl0OyBrKysgKQogICB7CiAgICAgIGZvcih1NjQgaSA9MDsgaTw4OyBpKyspCiAgICAgICAgIGlmKHByaW1lc1trXSAmIE9ORTw8IGkgJiYgbGNtKmsrRjMwW2ldIDwgbGltaXQpIHtjb3VudCsrOy8qc3RkOjpjb3V0IDw8IGxjbSprK0YzMFtpXSA8PCAiICI7Ki99CiAgIH0KICAgCiAgIHN0ZDo6Y291dCAgPDwgIlxuPT09PT09XG4iPDwgY291bnQgPDwgIlxuIjsKfQoKaW50IG1haW4oKQp7CiAgIGNsb2NrX3Qgc3RhcnQgPSBjbG9jaygpOwogICBnZXRQcmltZXNVcHRvKDEwMDAwMDApOwogICBzdGQ6OmNvdXQgPDwgIlxuVGltZTogIjw8IGNsb2NrKCkgLSBzdGFydCA8PCBzdGQ6OmVuZGw7Cn0=