Cod sursa(job #1337145)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 8 februarie 2015 17:20:51
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <cmath>
#include <stdint.h>
#include <cstring>

using namespace std;

#define MAX_N 2000000
#define IN_FILE "ciur.in"
#define OUT_FILE "ciur.out"

inline uint_fast32_t f_sieve( const uint_fast32_t &N ) {
    register uint_fast32_t sqr = static_cast < int > ( sqrt( static_cast < float > ( N ) ) );
    char sieve[ MAX_N + 1 ] = { };
    uint_fast32_t count = 2;
    for( uint_fast32_t i = 1; i <= sqr; ++i ) {
        for( uint_fast32_t j = 1; j <= sqr; ++j ) {
            register uint_fast32_t i2 = ( i * i ) * 3, j2 = ( j * j ), a = ( i2 + i * i ) + j2;
            if( a <= N && ( a % 12 == 1 || a % 12 == 5 ) )
                sieve[ a ] = !sieve[ a ];
            a = i2 + j2;
            if( a <= N && a % 12 == 7 )
                sieve[ a ] = !sieve[ a ];
            a = i2 - j2;
            if( i > j && a <= N && a % 12 == 11 )
                sieve[ a ] = !sieve[ a ];
        }
    }
    for( uint_fast32_t i = 5; i <= sqr; i += 2 )
        if( sieve[ i ] )
            for( uint_fast32_t i2 = i * i, j = i2; j < N; j += i2 )
                sieve[ j ] = 0;
    for( uint_fast32_t i = 5; i <= N; i += 2 )
        if( sieve[ i ] )
            ++count;
    return count;
}
int main( ) {
    FILE *f;
    unsigned char c;
    uint_fast32_t N = 0;

    f = fopen( IN_FILE, "r" );
    c = fgetc( f );
    while( c != '\n' ) {
        N = ( N << 1 ) + ( N << 3 ) + ( c - '0' );
        c = fgetc( f );
    }
    fclose( f );

    f = fopen( OUT_FILE, "w" );
    fprintf( f, "%u\n", f_sieve( N ) );
    fclose( f );
    return 0;
}