Cod sursa(job #822769)

Utilizator DraStiKDragos Oprica DraStiK Data 23 noiembrie 2012 23:34:38
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <cmath>
using namespace std;

ifstream cin ("ciur.in");
ofstream cout ("ciur.out");

const int MAXN=2000005;
bool is_prime[MAXN];
int N,SQRT,nrt;

int main () {
    cin>>N; SQRT=(int)sqrt (N)+1;

    int value;
    for (int x=1; x<=SQRT; ++x)
        for (int y=1; y<=SQRT; ++y) {
            value=((x*x)<<2)+(y*y);
            if (value<=N && (value%12==1 || value%12==5))
                is_prime[value]=!is_prime[value];

            value-=x*x;
            if (value<=N && value%12==7)
                is_prime[value]=!is_prime[value];

            value-=(y*y)<<1;
            if (x>y && value<=N && value%12==11)
                is_prime[value]=!is_prime[value];
        }

    for (int i=5; i<=SQRT; ++i)
        if (is_prime[i])
            for (int j=i*i; j<=N; j+=i*i)
                is_prime[j]=false;

    nrt=2;
    for (int i=5; i<=N; ++i)
        if (is_prime[i])
            ++nrt;
    cout<<nrt;

    return 0;
}