Cod sursa(job #545976)

Utilizator chiar_nimeninimeni chiar_nimeni Data 4 martie 2011 10:45:19
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.65 kb
# include <stdio.h>

int n,urm[500001],a[500001],i;
void gen(int n)
{
	int i,j;
	if (n<=1) return;
	for (i=0; i<=n; i++) urm[i]=0;
	if (n==2) 
	{
		urm[0]=2;
		urm[2]=-1;
		return;
	}
	if (n==3) 
	{
		urm[0]=2;
		urm[2]=3;
		urm[3]=-1;
		return;
	}
	gen(n/2);
	for (a[1]=1,i=2; i<=n; i++)
	{
		j=a[i];
		while (j!=-1 && i*j<=n)
		{
			a[i*j]=j;
			j=urm[j];
		}
	}
	for (j=0,i=1; i<=n; i++)
		if (!a[i]) urm[j]=i,j=i;
	urm[j]=-1;
}
int main ()
{
freopen ("ciur.in","r",stdin);
freopen ("ciur.out","w",stdout);
scanf ("%d\n",&n);
gen (n);
int nr=0;
for (i=urm[0]; i!=-1; i=urm[i]) nr++;
printf ("%d\n",nr);
return 0;
}