Cod sursa(job #482158)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 2 septembrie 2010 18:02:14
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<bitset>
using namespace std;

class CBitset
{
	unsigned long numbits;
	vector<char> bits;
public:
	CBitset()
	{
	}
	
	CBitset(long n) : numbits(n), bits((n>>3)+1)
	{
	}
	
	bool operator[](unsigned long pos) const
	{
		return bits[pos>>3]&(1<<(pos&7));
	}
	
	void set(unsigned long pos, bool val=true)
	{
		switch(val)
		{
			case true:
				bits[pos>>3]|=(val<<(pos&7));
			break;
			default:
				bits[pos>>3]&=(~(1<<(pos&7)));
			break;
		}
	}
	
	const unsigned long size() const
	{
		return numbits;
	}
	
	void resize(long numb)
	{
		numbits=numb;
		bits.resize((numb>>3)+1);
	}
};

struct PrimeSieve
{
	CBitset bits;
	PrimeSieve()
	{
	}
	PrimeSieve(unsigned long n) : bits(n)
	{
	}
	void GeneratePrimes(const long long n)
	{
		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.set(index>>1);
				}
			}
		}
	}
	
	const CBitset GetPrimes() const
	{
		return bits;
	}
};

int main()
{
	long long n,num=1;
	fstream fin("ciur.in", fstream::in);
	fstream fout("ciur.out", fstream::out);
	fin>>n;
	
	CBitset bits;
	PrimeSieve sieve(n);
	
	sieve.GeneratePrimes(n);
	bits=sieve.GetPrimes();
	/*bits.set(1);
	cout<<bits[1]<<endl;
	bits.resize(20);*
	//bits.set(1,false);
	cout<<bits[1]<<endl;*/
	/*PrimeSieve<1000002> primes;
	primes.GeneratePrimes(n);*/
	for(int i=1; (i<<1)+1<n; ++i)
	{
		if(! (sieve.GetPrimes())[i] )
		{
			num++;
			//cout<<(i<<1)+1<<" ";
		}
	}
	fout<<num<<endl;
	//cout<<endl<<num<<endl;

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