Cod sursa(job #1170175)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 12 aprilie 2014 20:08:24
Problema Ciurul lui Eratosthenes Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
// CIURUL LUI ATKIN
// O(n/loglog(n))
#include <cstdio>
#include <cmath>
#include <bitset>
using namespace std;
static const int NMAX=2000000;
bitset<NMAX> v;
int ciur(int);
int main()
{
    FILE *in=fopen("ciur.in","rt"),*out=fopen("ciur.out","wt");
    int n;
    fscanf(in,"%d",&n);
    fprintf(out,"%d",ciur(n));
    return 0;
}
int ciur(int limit)
{
    int r=ceil((double)sqrt(limit)),a,i,j,nrprime=2;
    for(i=1;i<=r;++i)
    {
        for(j=1;j<=r;++j)
        {
            a=4*i*i+j*j;
            if((a<=limit)&&(a%12==1||a%12==5)) v[a]=true;
            a-=(i*i);
            if((a<=limit)&&(a%12==7)) v[a]=true;
            a-=(2*j*j);
            if((i>j)&&(a<=limit)&&(a%12==11)) v[a]=true;
        }
    }
    for(i=5;i<=r;++i)
    {
        if(v[i])
        {
            for(j=(a=i*i);j<=limit;j+=a) v[j]=false;
        }
    }
    for(i=5;i<=limit;++i)
    {
        if(v[i])
        {
            ++nrprime;
        }
    }
    return nrprime;
}