Cod sursa(job #230472)

Utilizator mISHOOOmISHOOO mISHOOO Data 14 decembrie 2008 00:17:29
Problema Fractii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>  
  
FILE *fi = fopen("fractii.in", "r");  
FILE *fo = fopen("fractii.out", "w");  
  
unsigned long long int NF = 1;  
long N;  
  
long putere(long x, long y) {  
    long p = 1;  
  
    if (y==0) return 1;  
  
    for (int i=1; i<=y; i++) p*=x;  
    return p;  
}  
  
int prim(long X) {  
    long D=3;  
  
    if (X%2 == 0) return 0;  
  
    while (D*D<=X) {  
        if (X%D == 0) return 0;  
        D+=2;  
    }  
  
    return 1;  
}  
  
unsigned long long int totient(long X) {  
    long D=2, k=0;  
    unsigned long long int NF = 0;  
  
    if (X==1) return 1;  
    if (prim(X)) return X-1;  
      
    while (X%D) D++;  
    while (X%D == 0) { X/=D;k++; }  
          
    NF += (putere(D, k-1)*(D-1)) * totient(X);  
      
    return NF;  
}  
  
int main() {  
    fscanf(fi, "%ld", &N);  
      
    for (long i=2; i<=N; i++) {  
        NF+=totient(i)*2;  
    }  
  
    fprintf(fo, "%llu\n", NF);  
          
    fclose(fi);  
    fclose(fo);  
  
    return 0;  
}