Pagini recente » Cod sursa (job #2543344) | Cod sursa (job #341817) | Cod sursa (job #1899853) | Cod sursa (job #2443513) | Cod sursa (job #1317339)
#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;
}