Cod sursa(job #1089925)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 22 ianuarie 2014 05:42:47
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<bitset>
using namespace std;

template<unsigned long numbits>
struct PrimeSieve
{
	long long num;
	bitset<numbits> bits;

	void GeneratePrimes(const long long n)
	{
		num=1;
		for(int i=1; ((i<<1)+1)*((i<<1)+1)<n; ++i)
		{
			if(!bits[i])
			{
				for(long long j=i; ((i<<1)+1)*((j<<1)+1)<n; ++j)
				{
					const long long index=((i<<1)+1)*((j<<1)+1);
					//cout<<"("<<((i<<1)+1)*((j<<1)+1)<<" "<<(i+j)+1<<")"<<" ";
					bits[index>>1]=1;
				}
			}
		}
	}
	
	const bitset<numbits>& GetPrimes() const
	{
		return bits;
	}
};

int main()
{
	long long n=10,num=1;
	fstream fin("ciur.in", fstream::in);
	fstream fout("ciur.out", fstream::out);
	//fin>>n;
	PrimeSieve<16000002> primes;
	primes.GeneratePrimes(n);
	for(int i=1; (i<<1)+1<n; ++i)
	{
		if(! (primes.GetPrimes())[i] )
		{
			num++;
			//cout<<(i<<1)+1<<" ";
		}
	}

	cout<<num<<endl;
	//cout<<endl<<num<<endl;

	fin.close();
	fout.close();
	return 0;
}