Cod sursa(job #900048)

Utilizator vendettaSalajan Razvan vendetta Data 28 februarie 2013 17:27:14
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

ifstream f("ciur.in");
ofstream g("ciur.out");

#define nmax 2000005
#define ll long long

int n;
bool viz[nmax];
vector<int> p;

void citeste(){
    f >> n;
}

void bagaCiur(){
    for(int i=2; i<nmax; ++i){
        if (viz[i] == 1) continue;// i nu e numar prim
        // i e prim
        p.push_back(i);
        for(int j=i*2; j<nmax; j+=i){
            viz[j] = 1;
        }
    }
}

int cb(int val){
    int st = -1; int dr = p.size();
    while(dr-st>1){
        int mij = (st + dr) / 2;
        if ( p[mij] <= val ){
            st = mij;
        }else dr = mij;
    }
    return st+1;
}

void rezolva(){
    bagaCiur();
    //cout << cb(n) << "\n";
    g << cb(n) << "\n";
}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}