Cod sursa(job #299668)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 6 aprilie 2009 22:10:25
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <stdio.h>
#define maxN 	2000100
char prim[maxN];
int N;

int main () {
	int i, x, y, now, k;

	freopen("ciur.in", "r", stdin);
	freopen("ciur.out", "w", stdout);

	scanf("%d", &N);

	for (x = 1; x * x <= N; ++ x)
		for (y = 1; y * y <= N; ++ y) {
			i = 4 * x * x + y * y;
			if (i <= N && (i % 12 == 1 || i % 12 == 5))
				prim[i] = prim[i] ^ 1;
			
			i = 3 * x * x + y * y;
			if (i <= N && (i % 12 == 7))
				prim[i] = prim[i] ^ 1;

			i = 3 * x * x - y * y;
			if (x > y && i <= N && i % 12 == 11)
				prim[i] = prim[i] ^ 1;
		}

	for (i = 5; i * i <= N; ++ i)
		if (prim[i]) {
			now = i * i;
			for (k = now; k <= N; k += now)
				prim[k] = 0;
		}
	
	int Sol = 1; prim[4] = 0; prim[2] = prim[3] = 1;

	for (i = 2; i <= N; ++ i)
		if (prim[i])
			++ Sol;

	printf("%d\n", Sol);

}