Cod sursa(job #24565)

Utilizator lluckyLuca Vlad llucky Data 2 martie 2007 21:15:24
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXSIZE 1000001

int n,nr;

int citire()
{
FILE *f=fopen("fractii.in","r");
fscanf(f,"%d",&n);
fclose(f);
return 1;
}

int  p[MAXSIZE], prim[MAXSIZE];
float p2[MAXSIZE];

const int tryit(int m)
{
 int j=0;
 while(pow(m,j+2)<n) j++;
 return j*(-1);
}

int tot(int m)
{
 if(m==1) {p2[m]=n; return 1;}
 int i,j,d=0;
 memset(p,0,n*8);
 for(i=2;i<=n;i++)
	if(p[i]==0&&m%i==0)
		{p[i]=1; for(j=i*i; j<=n; j+=i) p[j]=2; d++;}
 if(d==1)
	{
	 prim[m]=1;
	 p2[m]=n-1+tryit(m);
	 for(j=m*m;j<=n;j*=m)
		p2[j]=p2[m];
	}
 else
	{p2[m]=m;
	 for(i=2;i<=m;i++)
		if(p[i]==1)
		 {
			p2[m]=(float)p2[m]*(1-(float)1/i);
		 }
	 for(i=2;i<=n;i++)
		if(p[i]==2)
			++p2[m];
	}
return 1;
}


int main(void)
{
int i;
FILE *f;
citire();
for(i=1;i<=n;i++)
 {if(p2[i]==0) tot(i);
 nr+=(int)p2[i];
 }
f=fopen("fractii.out","w");
fprintf(f,"%d\n",nr);
fclose(f);
return 0;
}