Cod sursa(job #308533)

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

long long fractii;  
long n,phi[MAXN];


void genereaza_phi ()    // generam printr-o tehnica gen ciurul lui Eratostene
{ int i,j;
  for (i=2; i<=n; i++)   // phi[i] reprezinta .... phi(i),d'oh!  
   phi[i]=i;            
  for (i=2; i<=n; i++)  
   if (phi[i]==i)        // daca e adevarat inseamna ca e prim din moment ce e generat cu ciurul lui ....
    { phi[i]--;          // daca e prim formula e phi(i)=i-1;
      for (j=2*i; j<=n; j+=i)  // impartim multiplii de i cu i (o singura data pentru fiecare)  pentru a obtine i^(exp-1) pentru 
       phi[j]=phi[j]/i*(i-1); // fiecare multiplu si inmultim cu (i-1) (tot dupa formula) acest lucru fiind necesar doar odata
    }                        
}

int main ()
{ f>>n;
  genereaza_phi ();
  for (int i=2; i<=n; i++)
   fractii+=phi[i];
  fractii=(fractii<<1)+1;
  g<<fractii;
  f.close (); g.close ();
  return 0;
}