Cod sursa(job #195829)

Utilizator andrei.ismailIsmail Andrei-Adnan andrei.ismail Data 22 iunie 2008 00:33:10
Problema Fractii Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>

#define MAX 1000000
int cache[MAX]; /* Coprime caching */

/* Return the number of coprime numbers < n. */
int coprimes(int n) {
	int result = 1, d = 2, found = 0;
	while (n > 1 && !found) {
		int factor = 1;
		while (n % d == 0) {
			factor *= d;
			n /= d;
		}
		if (factor > 1) {
			result *= factor - factor / d;
			result *= cache[n];
			found = 1;
		}
		if (d != 2)
			d += 2;
		else
			d = 3;
	}
	return result;
}

/* Generate coprimes for each number <= n */
void gen_coprimes(int n) {
	int i;

	cache[1] = 1;
	cache[2] = 1;
	cache[3] = 2;
	for (i = 4; i <= n; i++)
		cache[i] = coprimes(i);
}

int main(void) {
	FILE *fin, *fout;
	int n, i;
	long long result = 0;

	fin = fopen("fractii.in", "rt");
	fscanf(fin, "%d\n", &n);
	fclose(fin);

	gen_coprimes(n);
	result = 1;
	for (i = 2; i <= n; i++) {
		result += 2 * cache[i];
	}

	fout = fopen("fractii.out", "wt");
	fprintf(fout, "%lld\n", result);
	fclose(fout);
	return 0;
}