Cod sursa(job #736518)

Utilizator BitOneSAlexandru BitOne Data 18 aprilie 2012 21:14:40
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N_MAX=(2000000>>4)|1;
int isNPrime[N_MAX];

int main()
{
    int N, i, j, toAdd, count;
    ifstream in("ciur.in");
    ofstream out("ciur.out");

    in>>N;
    count=(N+1)>>1;
    for(i=1; ((i*i)<<1)+(i<<1) < N; ++i)
        if(0 == (isNPrime[i>>3] & (1<<(i&7))) )
        {
            toAdd=(i<<1)|1;
            for(j=((i*i)<<1)+(i<<1); (j<<1) < N; j+=toAdd)
            {
                if(0 == (isNPrime[j>>3] & (1<<(j&7))) )
                {
                    --count;
                }
                isNPrime[j>>3]|=1<<(j&7);
            }
        }
    out<<count<<'\n';
    return EXIT_SUCCESS;
}