Cod sursa(job #3219058)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 29 martie 2024 20:27:34
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

const int32_t MAX_N = 2000000;
const int32_t MAX_SIZE = (MAX_N >> 4) + 1;

uint8_t ciur[MAX_SIZE];
int main() {
    std::ifstream fin("ciur.in");
    std::ofstream fout("ciur.out");

    int32_t n;
    fin >> n;

    for(int32_t i = 3, sqr = 9; sqr <= n; sqr += (i << 2) + 4, i += 2) {
        int32_t ind = i >> 1;
        if(ciur[ind >> 3] & (1 << (ind & 7)))
            continue;

        for(int32_t j = sqr; j <= n; j += i << 1) {
            ind = j >> 1;
            ciur[ind >> 3] |= 1 << (ind & 7);
        }
    }

    int32_t count = 1;
    for(int32_t i = 3; i <= n; ++i) {
        if(!(i & 1))
            continue;

        int32_t ind = i >> 1;
        count += !(ciur[ind >> 3] & (1 << (ind & 7)));
    }

    fout << count;

    fin.close();
    fout.close();

    return 0;
}