#include <cstdio>
#include <vector>
#include <cstring>
#include <thread>
using namespace std;
#define REALMAXN 2000000000
#define MAXN 2002000000
#define SQRTN 45000
#define BLOCKSIZE 500000
// Automatically zeroed in G++
// 0 means primes, 1 means composite number
// Threated as block of bits
unsigned long long big_sieve[MAXN/64];
// We are piglors and use global shared variables
vector<pair<int, int>> big_primes;
void do_sieve(int start, int end, vector<pair<int, int>> primes) {
for (auto &p: primes) {
auto start_mul = start / p.first + 1;
if (start_mul % 2 == 0) {
start_mul += 1;
}
p.second = max(p.second, start_mul*p.first);
}
for (int i = start; i < end; i+=BLOCKSIZE) {
for (auto &p: primes) {
while (p.second < i + BLOCKSIZE) {
big_sieve[p.second/64] |= 1ll << (p.second % 64);
p.second += p.first * 2;
}
}
}
}
int main() {
vector<bool> sieve(SQRTN, true);
vector<pair<int, int>> small_primes;
for (int i = 2; i < SQRTN; i++) {
if (sieve[i]) {
for (int j = i*i; j < SQRTN; j += i) {
sieve[j] = false;
}
if (i <= 13) {
small_primes.push_back(make_pair(i, i*i));
} else {
big_primes.push_back(make_pair(i, i*i));
}
}
}
// Presieving with 2, 3, 5, 7, 11, 13
int lim = 2 * 3 * 5 * 7 * 11 * 13 * 32;
int limull = lim / 64;
for (int i = 0; i < lim; i+=2) {
big_sieve[i/64] |= 1ull << (i % 64);
}
for (int i = 0; i < lim; i+=3) {
big_sieve[i/64] |= 1ll << (i % 64);
}
for (int i = 0; i < lim; i+=5) {
big_sieve[i/64] |= 1ll << (i % 64);
}
for (int i = 0; i < lim; i+=7) {
big_sieve[i/64] |= 1ll << (i % 64);
}
for (int i = 0; i < lim; i+=11) {
big_sieve[i/64] |= 1ll << (i % 64);
}
for (int i = 0; i < lim; i+=13) {
big_sieve[i/64] |= 1ll << (i % 64);
}
for (int i = limull; i + limull < MAXN/64; i+=limull) {
memcpy(big_sieve + i, big_sieve, limull * 8);
}
thread t1(do_sieve, 0, 500000000, big_primes);
thread t2(do_sieve, 500000000, 1000000000, big_primes);
thread t3(do_sieve, 1000000000, 1500000000, big_primes);
thread t4(do_sieve, 1500000000, 2000000000, big_primes);
t1.join();
t2.join();
t3.join();
t4.join();
int total = 0;
for (int i = 0; i < REALMAXN/64; i++) {
total += __builtin_popcountl(big_sieve[i]);
}
// Correction by 5 due to 2,3,5,7,11,13 (and 1)
printf("%d %d\n", 5 + REALMAXN - total, small_primes.size());
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDx0aHJlYWQ+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBSRUFMTUFYTiAyMDAwMDAwMDAwCiNkZWZpbmUgTUFYTiAyMDAyMDAwMDAwCiNkZWZpbmUgU1FSVE4gNDUwMDAKI2RlZmluZSBCTE9DS1NJWkUgNTAwMDAwCgoKLy8gQXV0b21hdGljYWxseSB6ZXJvZWQgaW4gRysrCi8vIDAgbWVhbnMgcHJpbWVzLCAxIG1lYW5zIGNvbXBvc2l0ZSBudW1iZXIKLy8gVGhyZWF0ZWQgYXMgYmxvY2sgb2YgYml0cwp1bnNpZ25lZCBsb25nIGxvbmcgYmlnX3NpZXZlW01BWE4vNjRdOwoKLy8gV2UgYXJlIHBpZ2xvcnMgYW5kIHVzZSBnbG9iYWwgc2hhcmVkIHZhcmlhYmxlcwp2ZWN0b3I8cGFpcjxpbnQsIGludD4+IGJpZ19wcmltZXM7Cgp2b2lkIGRvX3NpZXZlKGludCBzdGFydCwgaW50IGVuZCwgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBwcmltZXMpIHsKICAgIGZvciAoYXV0byAmcDogcHJpbWVzKSB7CiAgICAgICAgYXV0byBzdGFydF9tdWwgPSBzdGFydCAvIHAuZmlyc3QgKyAxOwogICAgICAgIGlmIChzdGFydF9tdWwgJSAyID09IDApIHsKICAgICAgICAgICAgc3RhcnRfbXVsICs9IDE7CiAgICAgICAgfQogICAgICAgIHAuc2Vjb25kID0gbWF4KHAuc2Vjb25kLCBzdGFydF9tdWwqcC5maXJzdCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrPUJMT0NLU0laRSkgewogICAgICAgIGZvciAoYXV0byAmcDogcHJpbWVzKSB7CiAgICAgICAgICAgIHdoaWxlIChwLnNlY29uZCA8IGkgKyBCTE9DS1NJWkUpIHsgCiAgICAgICAgICAgICAgICBiaWdfc2lldmVbcC5zZWNvbmQvNjRdIHw9IDFsbCA8PCAocC5zZWNvbmQgJSA2NCk7CiAgICAgICAgICAgICAgICBwLnNlY29uZCArPSBwLmZpcnN0ICogMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8Ym9vbD4gc2lldmUoU1FSVE4sIHRydWUpOwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBzbWFsbF9wcmltZXM7CiAgICBmb3IgKGludCBpID0gMjsgaSA8IFNRUlROOyBpKyspIHsKICAgICAgICBpZiAoc2lldmVbaV0pIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkqaTsgaiA8IFNRUlROOyBqICs9IGkpIHsKICAgICAgICAgICAgICAgIHNpZXZlW2pdID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGkgPD0gMTMpIHsKICAgICAgICAgICAgICAgIHNtYWxsX3ByaW1lcy5wdXNoX2JhY2sobWFrZV9wYWlyKGksIGkqaSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYmlnX3ByaW1lcy5wdXNoX2JhY2sobWFrZV9wYWlyKGksIGkqaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIFByZXNpZXZpbmcgd2l0aCAyLCAzLCA1LCA3LCAxMSwgMTMKICAgIGludCBsaW0gPSAyICogMyAqIDUgKiA3ICogMTEgKiAxMyAqIDMyOwogICAgaW50IGxpbXVsbCA9IGxpbSAvIDY0OwogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbTsgaSs9MikgewogICAgICAgIGJpZ19zaWV2ZVtpLzY0XSB8PSAxdWxsIDw8IChpICUgNjQpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW07IGkrPTMpIHsKICAgICAgICBiaWdfc2lldmVbaS82NF0gfD0gMWxsIDw8IChpICUgNjQpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW07IGkrPTUpIHsKICAgICAgICBiaWdfc2lldmVbaS82NF0gfD0gMWxsIDw8IChpICUgNjQpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW07IGkrPTcpIHsKICAgICAgICBiaWdfc2lldmVbaS82NF0gfD0gMWxsIDw8IChpICUgNjQpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW07IGkrPTExKSB7CiAgICAgICAgYmlnX3NpZXZlW2kvNjRdIHw9IDFsbCA8PCAoaSAlIDY0KTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGltOyBpKz0xMykgewogICAgICAgIGJpZ19zaWV2ZVtpLzY0XSB8PSAxbGwgPDwgKGkgJSA2NCk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IGxpbXVsbDsgaSArIGxpbXVsbCA8IE1BWE4vNjQ7IGkrPWxpbXVsbCkgewogICAgICAgIG1lbWNweShiaWdfc2lldmUgKyBpLCBiaWdfc2lldmUsIGxpbXVsbCAqIDgpOwogICAgfQoKICAgIHRocmVhZCB0MShkb19zaWV2ZSwgICAgICAgICAgMCwgIDUwMDAwMDAwMCwgYmlnX3ByaW1lcyk7CiAgICB0aHJlYWQgdDIoZG9fc2lldmUsICA1MDAwMDAwMDAsIDEwMDAwMDAwMDAsIGJpZ19wcmltZXMpOwogICAgdGhyZWFkIHQzKGRvX3NpZXZlLCAxMDAwMDAwMDAwLCAxNTAwMDAwMDAwLCBiaWdfcHJpbWVzKTsKICAgIHRocmVhZCB0NChkb19zaWV2ZSwgMTUwMDAwMDAwMCwgMjAwMDAwMDAwMCwgYmlnX3ByaW1lcyk7CiAgICB0MS5qb2luKCk7CiAgICB0Mi5qb2luKCk7CiAgICB0My5qb2luKCk7CiAgICB0NC5qb2luKCk7CgogICAgaW50IHRvdGFsID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVBTE1BWE4vNjQ7IGkrKykgewogICAgICAgIHRvdGFsICs9IF9fYnVpbHRpbl9wb3Bjb3VudGwoYmlnX3NpZXZlW2ldKTsKICAgIH0KICAgIC8vIENvcnJlY3Rpb24gYnkgNSBkdWUgdG8gMiwzLDUsNywxMSwxMyAoYW5kIDEpCiAgICBwcmludGYoIiVkICVkXG4iLCA1ICsgUkVBTE1BWE4gLSB0b3RhbCwgc21hbGxfcHJpbWVzLnNpemUoKSk7Cn0=