Cod sursa(job #1835486)

Utilizator medicinedoctoralexandru medicinedoctor Data 26 decembrie 2016 22:27:46
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

vector <bool> a;
int n;

void prime()
{
    int k,p;

    for (int x=1; x*x<=n; x++)
        for (int y=1; y*y<=n; y++)
        {
            p=4*x*x+y*y;
            if (p<=n && (p % 12 ==1 || p % 12 ==5)) a[p]=! a[p];
            p-=x*x;
            if (p<=n && p % 12 == 7) a[p]=!a[p];
            p-=2*y*y;
            if (x>=y && p<=n && p % 12 == 11) a[p]=!a[p];
        }

    for (int i=5; i*i<=n; i++)
        if (a[i])
        {
            k=p=i*i;
            for (; p<=n; p+=k)
                a[p]=false;
        }
    a[2]=a[3]=true;
}

main()
{
    cin >> n;
    a.resize(n+1);
    prime();
    cout << count(a.begin(),a.end(),true);
}