Pagini recente » Cod sursa (job #1168912) | Cod sursa (job #1444030) | Cod sursa (job #2271104) | Cod sursa (job #1047540) | Cod sursa (job #2029339)
#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;
}