Cod sursa(job #2029339)

Utilizator stoianmihailStoian Mihail stoianmihail Data 29 septembrie 2017 21:01:22
Problema Ciurul lui Eratosthenes Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <cmath>

#define MAX_N 2000000
const int SQRT = sqrt(MAX_N);

int N;
int bitset[MAX_N / 32 + 1];

void set(int x) {
  bitset[x >> 5] |= (1 << (x & 31));
}

int get(int x) {
  return (bitset[x >> 5] >> (x & 31)) & 1;
}

int kern(int x) {
  return x ? (kern(x & (x - 1)) + 1) : 0;
}

void sieve() {
  int i, j;
  for (i = 4; i <= N; i += 2) {
    set(i);
  }

  for (i = 3; i <= SQRT; i += 2) {
    if (get(i) == 0) {
      for (j = i * i; j <= N; j += (i << 1)) {
        set(j);
      }
    }
  }
}

int main(void) {
  FILE *f = fopen("ciur.in", "r");
  freopen("ciur.out", "w", stdout);

  fscanf(f, "%d", &N);
  fclose(f);

  sieve();
  int i, count = 0, lim = N / 32 + 1;
  for (i = 0; i <= lim; i++) {
    count += kern(bitset[i]);
  }
  fprintf(stdout, "%d\n", N - count - 1);
  return 0;
}