Cod sursa(job #514500)

Utilizator ShootMeBistriceanu Andrei ShootMe Data 18 decembrie 2010 20:37:07
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXN 1000001

int n;
long long ciur[MAXN];

int max(int a, int b) {
	return a < b ? b : a;
}

void init_ciur(int val) {
	for (int i = 0; i <= n; i++) {
		ciur[i] = val;
	}
}

void make_fi_of_n_ciur() {
	for (int i = 2; i <= n; i++) {
		if (ciur[i] & 1) {
			ciur[i] = i - 1;
			for (int pos = i << 1; pos <= n; pos += i) {
				long long pow = i;
				long long aux = pos / i;
				ciur[pos] *= (i - 1);
				while (aux % i == 0) {
					ciur[pos] *= i;
					aux /= i;
				}
			}
		}
	}
}

//int get_fi(int v) {
//	int to = (int)floor(sqrt((double)v));
//	int contor = 2;
//	int result = 1;
//	if (contor > to) return v - 1;
//	while (v != 1 && contor <= to) {
//		if (v % contor == 0) {
//			int to_mult = contor - 1;
//			while (v % contor == 0) {
//				to_mult *= contor;
//				v /= contor;
//			}
//			to = (int)floor(sqrt((double)v));
//			result *= to_mult / contor;
//		}
//		contor ++;
//	}
//	return v != 1 ? result * (v-1) : result;
//}

//void brute() {
//	int sum = 1;
//	for (int i = 2; i <= n; i++) {
//		int v = get_fi(i);
//		sum += 2*v;
//	}
//	printf("\n%d\n", sum);
//}

int main() {
	freopen("fractii.in", "r", stdin);
	freopen("fractii.out", "w", stdout);

	scanf("%d", &n);

	init_ciur(1);

	make_fi_of_n_ciur();

	/*for (int i = 2; i <= n; i++) {
		printf("%d ", i);
	}printf("\n");

	for (int i = 2; i <= n; i++) {
		printf("%d ", ciur[i]);
	}printf("\n");*/

	int sum = 1;
	for (int i = 2; i <= n; i++) {
		sum += 2*ciur[i];
	}
	printf("%lld\n", sum);

	/*brute();*/

	return 0;
}