Cod sursa(job #136987)

Utilizator thestickTudor A thestick Data 16 februarie 2008 18:20:02
Problema Fractii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
long phic[1024];

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

long phi_nocache(long n)
{
long phi=1,p;
  for (p=2;p*p<=n;p += 2)
    {
      if(n%p==0)
	{
	  phi*=p-1;
	  n/=p;
	  while(n%p==0)
	    {
	      phi*=p;
	      n/=p;
	    }
	}
      if (p==2)
	p--;
    }
  return (n == 1) ? phi : phi * (n - 1);
}

void init_phic()
{
int i;
for(i=2;i<=1000;i++)phic[i]=phi_nocache(i);
}

long phi(long n)
{
if(n<=1000)return phic[i];
long phi=1,p,i;
for (i=2;(i<=1000)&&(i*i<=n);i++)
 if(n%i==0)
  if(cmmdc(n,i)==1){phi*=phic[i];n/=i;}
  for (p=2;p*p<=n;p += 2)
    {
      if(n%p==0)
	{
	  phi*=p-1;
	  n/=p;
	  while(n%p==0)
	    {
	      phi*=p;
	      n/=p;
	    }
	}
      if (p==2)
	p--;
    }
  return (n == 1) ? phi : phi * (n - 1);
}

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