Cod sursa(job #341805)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 19 august 2009 16:35:37
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>

using namespace std;

#define mp make_pair
#define pb push_back
#define sz(c) (int)((c).size())
#define f first
#define s second

#define fin  "ciur.in"
#define fout "ciur.out"

#define NMAX 2000001
#define pos(x,tmp) ( tmp = (( (x)/2 - 1 ) / 32) )

int N;
int v[NMAX/64];

int main()
{
	int i, j, count = 1, tmp;
	int pos, mask, rem;

	ifstream f(fin);
	ofstream f2(fout);

	f >> N;
	memset(v,0,sizeof(v));
	pos = 0;
	mask = -1;

	for ( i = 3; i <= N; i += 2 )
	{
		++mask;
		if ( mask == 32 ) ++pos, mask = 0;

		if ( (v[pos] & ( 1 << mask )) == 0 )
		{
			++count;
			for ( j = (tmp = (i << 1)) + i; j <= N; j += tmp )
				v[ pos(j,rem) ] |= ( 1 << ( (j >> 1) - 1 - (rem << 5) ));
		}
	}

	f2 << count << endl;

	return 0;
}