Cod sursa(job #230444)

Utilizator mISHOOOmISHOOO mISHOOO Data 13 decembrie 2008 22:38:36
Problema Fractii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 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, "%ull\n", NF);
		
	fclose(fi);
	fclose(fo);

	return 0;
}