Cod sursa(job #1170186)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 12 aprilie 2014 20:26:38
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
// CIURUL LUI ATKIN
// O(n/loglog(n))
#include <cstdio>
#include <cmath>
using namespace std;
static const int NMAX=2000000;
bool v[NMAX]={};
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(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])
        {
            //printf("%d\n",i);
            ++nrprime;
        }
    }
    return nrprime;
}