Cod sursa(job #299710)

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

bitset <maxN> prim;
int N, patrat[1416];

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

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

	scanf("%d", &N);

	for (i = 1; i <= 1415; ++ i)
		patrat[i] = patrat[i - 1] + i + i - 1;

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

			i = (patrat[x] << 1) + patrat[x] - patrat[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 = patrat[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);

}