Cod sursa(job #1089927)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 22 ianuarie 2014 05:47:03
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<bitset>
using namespace std;
 
template<unsigned long numbits>
struct PrimeSieve
{
    bitset<numbits> bits;
 
    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[index>>1]=1;
                }
            }
        }
    }
     
    const bitset<numbits>& 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;
    PrimeSieve<1000002> primes;
    primes.GeneratePrimes(n);
    for(int i=1; (i<<1)+1<n; ++i)
    {
        if(! (primes.GetPrimes())[i] )
        {
            num++;
            //cout<<(i<<1)+1<<" ";
        }
    }
 
    fout<<num<<endl;
    //cout<<endl<<num<<endl;
 
    fin.close();
    fout.close();
    return 0;
}