Cod sursa(job #299704)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 6 aprilie 2009 22:20:12
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <bitset>
#define maxN 	2000100
#define next(i) (i % 6 == 1) ? (4) : (2)
using namespace std;

bitset <maxN> prim;
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 += next(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;
	
	if (N >= 3)	Sol ++;

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

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

}