Cod sursa(job #482158)
#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;
}