Cod sursa(job #2692449)

Utilizator SerbaP123Popescu Serban SerbaP123 Data 2 ianuarie 2021 18:37:39
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("ciur.in");
ofstream fout("ciur.out");

int ciur(int limit, vector <int> &prim){
    bool mark[limit + 1];
    memset(mark, true, sizeof(mark));
    int primnumber = 0;
    for(int i = 2; i * i < limit; ++i){
        if(mark[i] == true){
            for(int j = i * i; j < limit; j += i){
                mark[j] = false;
            }
        }
    }
    for(int i = 2; i < limit; ++i){
        if(mark[i] == true){
            prim.push_back(i);
            primnumber++;
        }
    }
    return primnumber;
}

void sitasegmentata(int n){
    int limit = floor(sqrt(n)) + 1;
    vector <int> prim;
    int primnumber = ciur(limit, prim);
    int low = limit, high = 2 * limit;
    while(low < n){
        if(high >= n){
            high = n;
        }
        bool mark[limit + 1];
        memset(mark, true, sizeof(mark));
        for(int i = 0; i < prim.size(); ++i){
            int LoLim = floor(low / prim[i]) * prim[i];
            if(LoLim < low){
                LoLim += prim[i];
            }
            for(int j = LoLim; j < high; j += prim[i]){
                mark[j - low] = false;
            }
        }
        for(int i = low; i < high; ++i){
            if(mark[i - low] == true){
                primnumber++;
            }
        }
        low += limit;
        high += limit;
    }
    fout << primnumber;
}

int main(){
    int n;
    fin >> n;
    sitasegmentata(n);
    return 0;
}