Cod sursa(job #146111)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 1 martie 2008 10:54:46
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);
	printf("2");
	if (nrprime > 999) nrprime = 999;
	for (i = 3; nrprime; i += 2) {
		if (V[i >> 3] & (1 << (i & 7))) continue;
		--nrprime;
		printf(" %d", i);
	}
	printf("\n");

	return 0;
}