Cod sursa(job #287306)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 24 martie 2009 18:16:03
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>      
#include <math.h>      
using namespace std;   
  
ifstream f ("fractii.in");   
ofstream g ("fractii.out");   
        
char V[1000000];      
unsigned long long int rez = 1;        
     
long n;        
     
void gen_prim()   
{      
    for(int i=3;i<=1000000;i+=2)   
      if(V[i]==0)      
        for(int j=i*3;j<=1000000;j+=2*i) V[j] = 1;      
}      
        
unsigned long long int totient(long nr)   
{        
    long start=2, k=0;        
    unsigned long long int NF = 0;        
    if(nr==1) return 1;     
    if(nr%2 && V[nr] == 0) return nr-1;      
    while (nr%start) start++;      
    while (nr%start == 0) { nr/=start;k++; }        
    NF+=(long)(int)pow((double)start,(double)k-1)*(start-1)* totient(nr);        
    return NF;        
}        
        
int main()   
{        
    f>>n;   
    gen_prim();      
    for(long i=2;i<=n;i++)   
    {        
        rez+=totient(i)*2;        
    }      
    g<<rez<<"\n";        
    f.close();        
    g.close();       
    return 0;        
}