Cod sursa(job #342106)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 20 august 2009 17:18:13
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream.h>
#include <math.h>
long N,C[1000001],T[1000001];


ifstream fin("fractii.in");
ofstream fout("fractii.out");

void ciur()
{
long i,j;
for(i=4;i<=N;i=i+2)
 C[i]=1;
for(i=3;i<=sqrt(N)+1;i=i+2)
 if(C[i]==0)
  for(j=i*i;j<=N;j=j+2*i)
  C[j]=1;
}

void totient()
{

T[1]=1;
T[2]=1;
long i,j,p,x;


i=2;
for(j=2;pow(i,j)<=N;j++)
T[long(pow(i,j))]=(i-1)*pow(i,j-1);

for(i=3;i<=N;i=i+2)
 if(C[i]==0)
  for(j=1;pow(i,j)<=N;j++)
   T[long(pow(i,j))]=(i-1)*pow(i,j-1);

for(i=6;i<=N;i++)
 if(T[i]==0)
  for(j=i/2;j>=2;j--)
   if(C[j]==0 && i%j==0)
    {p=0;
     while(i%j==0)
      {i=i/j;
      p=p+1;}
      x=long(pow(j,p));
     T[i*x]=T[i]*T[x];
     i=i*x;
     j=1;
     }

}

int main()
{
fin>>N;
ciur();
totient();
long i;
long S;S=0;
//for(i=1;i<=N;i++)
//fout<<T[i]<<"\n";
for (i=1;i<=N;i++)
S=S+T[i];
fout<<S*2-1;
fin.close();
fout.close();
return 0;
}