Cod sursa(job #936803)

Utilizator BitOneSAlexandru BitOne Data 8 aprilie 2013 20:30:53
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.57 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int NMAX = (2000000 >> 4) | 1;

char isNPrime[NMAX];

int main()
{
	int N, i, j, count, toAdd;
	ifstream in("ciur.in");
	ofstream out("ciur.out");
	
	in >> N;
	count = (N + 1) >> 1;
	for(i = 1; ((i * i) << 1) + (i << 1) < N; ++i)
	{
		if(isNPrime[i >> 3] & (1 << (i & 7))) continue;
		toAdd = (i << 1) | 1;
		for(j = ((i * i) << 1) + (i << 1); (j << 1) < N; j += toAdd)
		{
			if(!(isNPrime[j >> 3] & (1 << (j & 7)))) --count;
			isNPrime[j >> 3] |= 1 << (j & 7);
		}
	}
	out << count << '\n';
	
	return EXIT_SUCCESS;
}