Cod sursa(job #1317330)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 14 ianuarie 2015 20:14:26
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

#define SIEVE_SIZE 32768

FILE *f;

int ciur( const int &N ) {
    int sq = ( int ) sqrt( ( double ) N );
    int count = 1, s = 2, n = 3;
    vector < char > sieve ( SIEVE_SIZE ), is_prime( sq + 1, 1 );
    vector < int > primes, next;
    for( register int i = 2; i * i <= sq; ++i ) {
        if( is_prime[ i ] )
            for( register int j = i * i; j <= sq; j += i )
                is_prime[ j ] = 0;
    }
    for( register int low = 0; low <= N; low += SIEVE_SIZE ) {
        fill( sieve.begin(), sieve.end(), 1 );
        register int high = min( low + SIEVE_SIZE - 1, N );
        while( s * s <= high ) {
            if( is_prime[ s ] ) {
                primes.push_back( s );
                next.push_back( s * s - low );
            }
            ++s;
        }
        for( register int i = 1; i < primes.size( ); ++i ) {
            register int j = next[ i ];
            for( int k = primes[ i ] << 1; j < SIEVE_SIZE; j += k )
                sieve[ j ] = 0;
            next[ i ] = j - SIEVE_SIZE;
        }
        while( n <= high ) {
            if( sieve[ n - low ] )
                ++count;
            n += 2;
        }
    }
    return count;
}
int main( ) {
    int N;
    f = fopen( "ciur.in", "r" );
    fscanf( f, "%d", &N );
    fclose( f );
    f = fopen( "ciur.out", "w" );
    fprintf( f, "%d\n", ciur( N ) );
    return 0;
}