Cod sursa(job #165526)

Utilizator plastikDan George Filimon plastik Data 26 martie 2008 11:41:43
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.61 kb
// Ciurul lui Eratosthenes, pe biti
// http://infoarena.ro/problema/ciur

#include <cstdio>
//#define HOME // TODO: sterge inainte de a trimite

const int NMAX = 268435456;

char Sieve[NMAX];
int n;

int main() {
	
	freopen("ciur.in", "r", stdin);
#ifndef HOME
	freopen("ciur.out", "w", stdout);
#endif
	
	scanf("%d", &n);
	
	int i, j, ans;
	for (i = 2; i <= n; ++ i) {
		if (Sieve[i / 8] & (1 << (i % 8)))
			continue;
		for (j = 2 * i; j <= n; j += i)
			Sieve[j / 8] |= (1 << (j % 8));
	}
	
	for (i = 2, ans = 0; i <= n; ++ i)
		if ( !(Sieve[i / 8] & (1 << (i %8))) )
			++ ans;
	
	printf("%d\n", ans);
	
	return 0;
}