Cod sursa(job #947296)
#include <fstream>
#include <cstdlib>
using namespace std;
const int NMAX = 2000011;
char isNPrime[NMAX];
int main()
{
int N, i, j, count, toAdd;
ifstream in("ciur.in");
ofstream out("ciur.out");
in >> N;
count = (N + 1) >> 1;
for(i = 1; ((i * i) << 1) + (i << 1) < N; ++i)
{
if(isNPrime[i >> 3] & (1 << (i & 7))) continue;
toAdd = (i << 1) | 1;
for(j = ((i * i) << 1) + (i << 1); (j << 1) < N; j += toAdd)
{
if(0 == (isNPrime[j >> 3] & (1 << (j & 7)))) --count;
isNPrime[j >> 3] |= 1 << (j & 7);
}
}
out << count << '\n';
return EXIT_SUCCESS;
}