Cod sursa(job #235990)

Utilizator Mishu91Andrei Misarca Mishu91 Data 26 decembrie 2008 14:18:47
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#include <bitset>
#include <cmath>

using namespace std;

#define MAX_D 50005
#define MAX_Nr 6005
#define MAX_N 100000003

long long A, B;
long long V[MAX_Nr];
int Nrd;
bitset <MAX_N> viz;
bitset <MAX_D >> 1> pr;

void desc(long long B)
{
    long sq = sqrt(B);
    V[++Nrd] = 4;
    for(long i = 3; i <= sq; i += 2)
    {
        if(pr[i >> 1] == 1) continue;

        V[++Nrd] = (long long) i*i;

        for(long j = (i >> 1) + i; j <= sq; j += i)
            pr[j] = 1;
    }
}

void ciur()
{
    for(int i = 1; i <= Nrd; ++i)
    {
        long long k = A;
        long r = A % V[i];
        if(r)
            k += (V[i] - r);
        for(long long j = k; j <= B; j += V[i])
                viz[j - A] = 1;
    }

    long Rez = 0;
    for(int i = 0; i <= B-A; ++i)
        if(viz[i] == 0)
            ++Rez;
    printf("%ld\n",Rez);

}

int main()
{
    freopen("nasa.in","rt",stdin);
    freopen("nasa.out","wt",stdout);

    scanf("%lld %lld",&A, &B);

    desc(B);
    ciur();
}