Cod sursa(job #2423318)

Utilizator rainerretzler rainer Data 21 mai 2019 00:26:49
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.8 kb
/// bril.cpp : Defines the entry point for the console application.

    //



    //#include "stdafx.h"

    //#include <fstream>

#include <cstdio>

#include <stdio.h>
#include<vector>

    using namespace std;



#define min(a,b) (a>b?b:a)

#define max(a,b) (a<b?b:a)





//ifstream fin("arbint.in");

//ofstream fout("arbint.out");



FILE *fin, *fout;






/*
unsigned long long rplN, rplP, rplR=1999999973ULL;

void doo(){
    unsigned long long t=1;
    for(unsigned long long i=1ULL;i<=rplP;i*=2ULL){
        if(i&rplP){
            t*=rplN;
            t%=rplR;
            }
        rplN*=rplN;
        rplN%=rplR;
        }
    fprintf(fout,"%llu",t);
    }
    */

/*
int n,m,d[100010],s;
vector<int> v[100010];

void myRead(){
    fscanf(fin,"%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;++i){
        fscanf(fin,"%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
        }
    }

void dfs(int nod){
    d[nod]=1;
    for(int i=0;i<v[nod].size();++i)
        if(d[v[nod][i]]==0)
            dfs(v[nod][i]);
    }

void doo(){
    for(int i=1;i<=n;++i)
        if(d[i]==0){
            ++s;
            dfs(i);
            }
        fprintf(fout,"%d\n",s);
    }


int noduri[270010];

int n, m,a,b;





void constr(int poz, int left, int right) {

    if (left == right) {

        //fin >> noduri[poz];

        //fscanf_s(fin, "%d", &noduri[poz]);

        fscanf(fin, "%d", &noduri[poz]);



        }

    else {

        int mid = (left + right) / 2;

        constr(2 * poz, left, mid);

        constr(2 * poz+1, mid+1, right);



        noduri[poz] = max(noduri[2 * poz], noduri[2 * poz + 1]);

        }

    }





void do1(int poz, int left, int right) {

    if (left == a&&right == a)

        noduri[poz] = b;

    else {

        int mid = (left + right) / 2;

        if (a <= mid)

            do1(2*poz, left, mid);

        else

            do1(2*poz+1, mid+1, right);

        noduri[poz] = max(noduri[2 * poz], noduri[2 * poz + 1]);

        }

    }



int do0(int poz, int a, int b, int left, int right) {

    if (left == a&&right == b)

        return noduri[poz];

    int mid = (left + right) / 2;

    if (b <= mid)

        return do0(2*poz, a, b, left, mid);

    if (a <= mid&&b > mid){
        int x1=do0(2 * poz, a, mid, left, mid), x2=do0(2 * poz + 1,mid+1,b, mid+1, right);
        return max(x1,x2);
        }

    if (a > mid)

        return do0(2 * poz+1, a, b, mid+1, right);

    return 0;



    }




    */



bool a[2000010];
int n;
int prep(){
    if(n==2)
        return 1;
    for(unsigned long long j=4;j<=n;j+=2)
        a[j]=1;
    int s=1;
    for(unsigned long long i=3;i<=n;i+=2)
        if(a[i]==false){
            ++s;
            for(unsigned long long j=i*i;j<=n;j+=i)
                a[j]=true;
            }
        return s;

    }


int main()

    {



    //errno_t err;

    //err = fopen_s(&fin, "arbint.in", "r");

    //err = fopen_s(&fout, "arbint.out", "w");

    fin=fopen( "ciur.in", "r");

    fout=fopen("ciur.out", "w");

    //fin >> n >> m;

    //fscanf(fin, "%llu%llu", &rplN,&rplP);

    //fscanf_s(fin, "%d%d", &n, &m);

    /*

    constr(1,1,n);

    int x, y, z;

    for (int i = 1; i <= m; ++i) {

        fscanf(fin, "%d%d%d", &x, &a,&b);

        //fscanf_s(fin, "%d%d%d", &x, &y, &z);

        if (x == 0)

            //fout << do0(1,y,z)<<"\n";

            fprintf(fout, "%d\n", do0(1,a,b,1,n));

        else

            do1(1,1,n);

        }
        */
    fscanf(fin,"%d",&n);
    //printf("%d",n);

    fprintf(fout,"%d", prep());

    fclose(fin);

    fclose(fout);

    return 0;

    }