Cod sursa(job #146115)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 1 martie 2008 10:58:45
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include <cstdio>

const int NMAX = 1 << 18;

unsigned char V[NMAX];

int main(void) {
	freopen("ciur.in", "rt", stdin);
	freopen("ciur.out", "wt", stdout);
	int N, i, j, i2, nrprime = 0;

	scanf(" %d", &N);

	// nu ne intereseaza numerele pare
	// pentru ca 2 este singurul numar prim par 
	// si il tratam separat
	for (i = 3; i <= N; i += 2) {
		if (V[i >> 3] & (1 << (i & 7))) continue;
		++nrprime;

		i2 = i + i;
		for (j = i + i2; j <= N; j += i2)
			V[j >> 3] |= 1 << (j & 7);
	}

	printf("%d\n", nrprime + 1);
	if (nrprime < 1000)
		printf("2 ");
	for (i = 3; nrprime; i += 2) {
		if (V[i >> 3] & (1 << (i & 7))) continue;
		if (nrprime-- <= 1000)
			printf("%d ", i);
	}
	printf("\n");

	return 0;
}