Cod sursa(job #2229226)

Utilizator inquisitorAnders inquisitor Data 6 august 2018 12:19:25
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
///1/2 = 0.5 = 50%

///1/2 + 1/3 - 1/6 = 2/3 = 0.(6) = 66%

///1/2 + 1/3 + 1/5 - 1/6 - 1/15 - 1/10 + 1/30 = 15/30 + 10/30 + 6/30 - 5/30 - 2/30 - 3/30 + 1/30 = 22/30 = 11/15 = 0.7(3) = 73%

///1/2 + 1/3 + 1/5 + 1/7 - 1/6 - 1/10 - 1/14 - 1/15 - 1/21 - 1/35 + 1/105 + 1/70 + 1/42 + 1/30 - 1/210 = 105/210 + 70/210 + 42/210 + 30/210 - 35/120 - 21/210 - 15/210 - 14/210 - 10/210 - 6/210 + 2/210 + 3/210 + 5/210 + 7/210 - 1/210 = 247/210 - 101/210 + 17/210 - 1/210 = 162/210 = 77%

#include <stdio.h>
#include <time.h>

int primes[2000000 /8/4/3 + 1];

int main(void)
{
    freopen("ciur.in", "r", stdin);
    freopen("ciur.out", "w", stdout);

    int N; scanf("%d", &N);

    for(int ix = 1; ix<= 1; ix++)
    {
        //auto Start = clock();

        int i, j, sqrt_N = __builtin_sqrtf(N), iBitNumber, iIndex, iBit, jBitNumber, jIndex, jBit, count = 2;

        for(i = 5; i <= sqrt_N; i += 4)
        {
            iBitNumber = i / 3 - 1, iIndex = iBitNumber >> 5, iBit = 1 << (iBitNumber & 31);

            if((primes[iIndex] & iBit) == 0)
            {
                for(j = i * i; j <= N; j += i << 2)
                {
                    jBitNumber = j / 3 - 1;

                    primes[jBitNumber >> 5] |= 1 << (jBitNumber & 31);

                    j += i << 1;

                    if(j >= N) break;

                    jBitNumber = j / 3 - 1;

                    primes[jBitNumber >> 5] |= 1 << (jBitNumber & 31);
                }
            }

            i += 2;

            iBit <<= 1;

            if((primes[iIndex] & iBit) == 0)
            {
                for(j = i * i; j <= N; j += i << 1)
                {
                    jBitNumber = j / 3 - 1;

                    primes[jBitNumber >> 5] |= 1 << (jBitNumber & 31);

                    j += i << 2;

                    if(j >= N) break;

                    jBitNumber = j / 3 - 1;

                    primes[jBitNumber >> 5] |= 1 << (jBitNumber & 31);
                }
            }
        }

        for(i = 5; i <= N; i += 4)
        {
            iBitNumber = i / 3 - 1, iIndex = (i / 3 - 1) >> 5, iBit   = (1 << (iBitNumber & 31));

            count += ((primes[iIndex] & (iBit     )) == 0);

            if((i += 2) < N) count += ((primes[iIndex] & (iBit << 1)) == 0);
        }

        //printf("%d =>", count);

        printf("%d", count);

        //auto End = clock();

        //auto Time = 1000.0 * (End - Start) / CLOCKS_PER_SEC;

        //cout << Time << "ms\n";
    }

    return 0;
}