Cod sursa(job #936666)

Utilizator BitOneSAlexandru BitOne Data 8 aprilie 2013 10:32:12
Problema Ciurul lui Eratosthenes Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <vector>
#include <cstdlib>
#include <fstream>


using namespace std;

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

char isNPrime[NMAX];

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