Cod sursa(job #657474)

Utilizator vgabi94Vaduva Gabriel vgabi94 Data 6 ianuarie 2012 17:24:03
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>
using namespace std;

ifstream fin("ciur.in");
ofstream fout("ciur.out");

int main()
{
	int n, nr = 2, lim;
	fin >> lim;
	double sqr = sqrt(lim);
	bool * isPrime = new bool[lim+1];
	memset(isPrime, 0, sizeof(bool)*(lim+1));
	for(int x = 1; x <= sqr; x++)
	{
		for(int y = 1; y <= sqr; y++)
		{
			n = 4 * x * x + y * y;
			if(n <= lim && (n % 12 == 1 || n % 12 == 5))
				isPrime[n] = !isPrime[n];
			n = 3 * x * x + y * y;
			if(n <= lim && n % 12 == 7)
				isPrime[n] = !isPrime[n];
			n = 3 * x * x - y * y;
			if(x > y && n <= lim && n % 12 == 11)
				isPrime[n] = !isPrime[n];
		}
	}

	for(int i = 5; i <= sqr; i+=2) 
	{
		if(isPrime[i])
		{
			for(int k = i*i; k <= lim; k+=i*i)
				isPrime[k] = false;
		}
	}

	for(int i = 5; i <= lim; i+=2)
		if(isPrime[i]) ++nr;
	fout << nr;
	delete[] isPrime;
	return 0;
}