Cod sursa(job #548683)

Utilizator cont_de_testeCont Teste cont_de_teste Data 7 martie 2011 18:20:09
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
const int MAX = 1 << 18;

unsigned char V[MAX];
//a - (a / mod) * mod
inline int mod ( int a, int moD ) {
    if (a >= moD) a %= moD;
    return a ;
}
int main() {
    int limit;

    ifstream f("ciur.in");
    ofstream g("ciur.out");

    f>>limit;

    int i,j,x,k = sqrt ( limit );

    for (i=1; i<=k; i++)
        for (j=1; j<=k; j++) {
            x = 4*i*i+j*j;
            if (x<limit) if ((mod(x,12)==1) || (mod(x,12)==5)) V[x >> 3] ^= 1 << ( x & 7 ) ;
            x = 3*i*i+j*j;
            if (x<limit) if (mod(x,12)==7) V[x >> 3] ^= 1 << ( x & 7 ) ;
            x = 3*i*i-j*j;
            if (i>j) if (x<limit) if (mod(x,12)==11) V[x >> 3] ^= 1 << ( x & 7 ) ;
        }

    for (i=5; i<=k; i++) {
        x = i*i;
        j = 1;
        while (j*x<limit) {
            V[j*x >> 3] &= 255 - ( 1 << ( j*x & 7 ) );
            j++;
        }
    }
V[2 >> 3] |= 1 << ( 2 & 7 ) ;
V[3 >> 3] |= 1 << ( 3 & 7 ) ;

    x = 0;
    for (i=2; i<limit; i++) if ( V[i >> 3] & ( 1 << ( i & 7 ) ) ) x++;

    g<<x;


}