Cod sursa(job #119110)

Utilizator mike4problemsRadu Gabriel mike4problems Data 29 decembrie 2007 16:16:26
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.7 kb
#include<cstdio>
#define Max 1000001
long long p[Max];
long long n;
long long rez;

void ciur()
 {
 long long i,j;
 for(i=4;i<=n;i+=2) p[i]=2;
 for(i=3;i<=n;i+=2)
  if(p[i]==0)
   for(j=i*i;j<=n;j+=2*i)
    p[j]=i;
 }

void totient()
 {
 double tot;
 long long i,j,k;
 for(i=2;i<=n;i++)
  {
  for(tot=(double)i,k=i,j=p[k];j;j=p[k])
   {
   tot*=(1-1/(double)j);
   while(k%j==0)
    k/=j;
   }
  if(k>1) tot*=(1-1/(double)k);
//  printf("tot(%lld)=%.0lf\n",i,tot);
  rez+=(long long)tot;
  }
 rez=2*rez+1;
 }

int main()
 {
 freopen("fractii.in","r",stdin);
 scanf("%lld",&n);
 ciur();
 totient();
 freopen("fractii.out","w",stdout);
 printf("%lld\n",rez);
 return 0;
 }