Cod sursa(job #230487)

Utilizator mISHOOOmISHOOO mISHOOO Data 14 decembrie 2008 00:58:41
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h> 
#include <math.h>
  
FILE *fi = fopen("fractii.in", "r");  
FILE *fo = fopen("fractii.out", "w");  
  
char V[1000000];
unsigned long long int NS = 1;  

long N;  

void genPrime() {
	for (int i=3; i<=1000000; i+=2)
		if (V[i] == 0)
		for (int j=i+i+i; j<=1000000; j+=2*i)
			V[j] = 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 (X%2 && V[X] == 0) return X-1;

    while (X%D) D++;
    while (X%D == 0) { X/=D;k++; }  
          
    NF += (long)(int)pow((double)D, (double)k-1)*(D-1)* totient(X);  
      
    return NF;  
}  
  
int main() {  
    fscanf(fi, "%ld", &N);
	genPrime();
      
    for (long i=2; i<=N; i++) {  
        NS+=totient(i)*2;  
    }
  
    fprintf(fo, "%llu\n", NS);  
          
    fclose(fi);  
    fclose(fo);  
  
    return 0;  
}