Cod sursa(job #308517)

Utilizator ucc_5Usurelu Catalin ucc_5 Data 27 aprilie 2009 16:31:56
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <fstream>
#include <cmath>
#define MAXN 1000001
using namespace std;
ifstream f("fractii.in");
ofstream g("fractii.out");

long v[MAXN+1],n,nr_ciur=1,fractii=1;

void ciur (long n)
{ long aux=long(double(sqrt(double(n)))),i,j;
  v[1]=2;
  for (i=3; i<=aux; i+=2)
   { if (v[i]==0)
     { v[++nr_ciur]=i;
       for (j=3*i; j<=n; j+=i<<1)
	v[j]=1;
     }
   }
   for (; i<=n; i+=2)
    if (v[i]==0)
     v[++nr_ciur]=i;
}

long indicatorul_lui_Euler (long n)
{ long f_prim=1;
  long double totient=n;;
  while (v[f_prim]<=n)
  { if (n%v[f_prim]==0)
	  totient*=(1-1/(double)v[f_prim]);
    f_prim++;
  }
  return (long)ceil(totient);
}

int main ()
{ f>>n; long aux;
  ciur (MAXN);
  for (int i=2; i<=n; i++)
   fractii+=(2*(aux=indicatorul_lui_Euler (i)));
  g<<fractii;
  f.close (); g.close ();
  return 0;
}