Cod sursa(job #52632)

Utilizator sir_icemasterGeorge Guraliuc sir_icemaster Data 19 aprilie 2007 16:15:00
Problema Fractii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <math.h>
#include <time.h>
#define NMAX 10101
#define NPRIMES 78500

long tot[NMAX], notprime[NMAX];
long np, prime[NPRIMES];
long n; 
long sum = 1;

void searchp() {
	long i, d, power, f;
	for (i = 2; i < NMAX; ++i) {
		if (!notprime[i]) {
			tot[i] = f = i-1;
			for (d = 2; i * d < NMAX; ++d)
				notprime[i*d] = 1;
			for (power = i*i; power < NMAX; power *= i) {
				f *= i;
				tot[power] = f;
			}
		}
	}
}
void phi(long n) {
	long i, rad = sqrt(n);
	long tmp = n;
	double f = n;
	for (i = 0; prime[i] < rad; ++i)
		if (!(n % prime[i]))
			if ((n/prime[i]) % prime[i] == 0)
				tot[n] = prime[i] * tot[n/prime[i]];
			if (!tot[n]) {
		for (i = 0; prime[i] < tmp; ++i)
			if (!(n % prime[i]))
				f *= 1 - 1./prime[i];
		tot[n] = (long)f;
	}
}
int main() {
	clock_t end;
	long i;
	FILE * fi = freopen("fractii.in", "r", stdin);
	FILE * fo = freopen("fractii.out", "w", stdout);
	scanf("%ld", &n);
	searchp();
	for (i = 2; i < NMAX; ++i)
		if (!notprime[i])
			prime[np++] = i;
	/*for (i = 0; i < NPRIMES; ++i)
		if (prime[i])
		printf("%ld ", prime[i]);
	*/
	for (i = 2; i < NMAX-100; ++i)
		if (!tot[i])
			phi(i);
	for (i = 2; i <= n; ++i)
		sum += 2 * tot[i];
	//phi(10);
	end = clock();
	printf("%ld\n", sum);
	return 0;
}