Cod sursa(job #137167)

Utilizator thestickTudor A thestick Data 17 februarie 2008 02:33:20
Problema Fractii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
long pc[1000000];

long prim(long a)
{
long i;
if(a<=1)return 0;
if(a==2)return 1;
if(a%2==0)return 0;
for(i=3;i*i<=a;i+=2)
if(a%i==0)return 0;
}

long cmmdc(long a,long b)
{
if(b==0)return a;
return cmmdc(b,a%b);
}

long shi(long n)
{
long flag=1,e=0,p,nb=n;
if(prim(n)){pc[n]=n-1;return(n-1);}
if(pc[n]==0)
	{
	long d=2;
	if(n%2!=0)
		{
		d=3;
		while((d*d<=n)&&(flag))
			{
			if(n%d==0)flag=0;
                        else{d+=2;}
			}
		}
	while(n%d==0)
		{
		e++;
		n/=d;
		}
	p=(d-1);
	while(e-1)
		{
		e--;
		p*=d;
		}
	pc[nb]=p*shi(n);
	return(pc[nb]);
	}
return(pc[nb]);
}

int main()
{
long i=0;
long nn=0;
long long s=0;
FILE *f;
pc[1]=1;
f=fopen("fractii.in","r");
fscanf(f,"%d",&nn);
fclose(f);
nn++;
for(i=2;i<nn;i++)
s+=shi(i);
s*=2;
s++;
FILE *g;
g=fopen("fractii.out","w");
fprintf(g,"%lld\n",s);
fclose(g);
return 0;
}