Pagini recente » Cod sursa (job #210968) | Borderou de evaluare (job #366937) | Cod sursa (job #2482076) | Cod sursa (job #173632) | Cod sursa (job #1337145)
#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;
}