Cod sursa(job #24091)

Utilizator lluckyLuca Vlad llucky Data 1 martie 2007 20:20:34
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXSIZE 1000001

int n;

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

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

int wtf(int m)
{
 int i,d=0;
 for(i=m+1;i<=n;i++) if(i%m!=0) d++;
 return d;
}
int wtf2(int m)
{
 int i,j,d=0,b;
 for(i=m+1;i<=n;i++)
	if(i%m!=0)
	 {b=1;
		for(j=2;j<=m;j++)
		if(p[j]==1&&i%j==0) {b=0; break;}
		if(b) d++;
	 }
 return d;
}



int tot(int m)
{
 if(m==1) {p2[m]=n; return 1;}
 int i,j,d=1;
 memset(p,0,m*8);
 for(i=2;i<=m/2;i++)
	if(p[i]==0)
	if(m%i==0)
		{p[i]=1; for(j=i*i; j<=m; j+=i) p[j]=2; d++;}
 if(d==1)
	{
	 prim[m]=1;
	 p2[m]=m-1+wtf(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)
		 {
//			if(prim[i]==1) {p2[m]=p2[i]*p2[2]; break;}
			p2[m]=(float)p2[m]*(1-(float)1/i);
		 }
	 p2[m]+=wtf2(m);
	}
return 1;
}


/*int numar(int q) {
	 int i, j, nr = 0;
memset(p,0,n*8);
for(i=2; i<=n; i++)
		{
		 if(p[i]==0)
			{
			 if(q%i==0||i%q==0)
				 for(j=i; j<=n; j+=i) p[j]=1;
			 else nr++;
			}
		}

	 return nr;
 }*/

int main(void)
{
int i,nr=0;
FILE *f;
citire();
for(i=1;i<=n;i++)
 if(p2[i]==0) tot(i);
for(i=1;i<=n;i++)
 nr+=(int)p2[i];
/*
for(i=2;i<=n;i++)
 if(p2[i]==0)
	{
	 t=numar(i);
	 for(j=i;j<=n;j+=i)
	 {
	 k=j/i;
	 if(!p2[k]){
	 p2[j]=t;
	 }
	 else
		{ o=p2[i]-p2[k]; if(o<0) o=o*(-1);
		 if(o==0) p2[j]=t;
		 else p2[j]=o;
		}
	 }
	}
for(i=2;i<=n;i++) nr+=p2[i];*/
f=fopen("fractii.out","w");
fprintf(f,"%d\n",nr);
fclose(f);
return 0;
}