Cod sursa(job #65600)

Utilizator nobodybanAna Ban nobodyban Data 11 iunie 2007 02:46:25
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <math.h>

using namespace std;


long prime[1000001], n, p[1000001];


void citire() {
	ifstream in("fractii.in");
	in >> n;	
}

void gen_prime() {
	// 1 nu e prim
	//	// 0 e prim
	prime[1000000] = 1;
	for (long d = 3; d < 1000000; d+=2) {
		prime[d - 1] = 1;
		if (prime[d] == 0)
			for (long v= 2; v*d < 1000000; v++)
				prime[d * v] = 1;
	}
	prime[2] = 0;
}


long long numar(long nr) {
	//if (prime[nr] == 0)
	//	return nr - 1;

	int cnt = 0;
	while ((nr & 1) == 0) {
		nr >>= 1;
		cnt++;
	}
	if (cnt)
		return (1 << (cnt -1) ) * p[nr];

	for (long d = 3; d <= nr / d; d +=2) {
		int cnt = 0;
		while (nr % d == 0) {
			nr /= d;
			cnt++;
		}
		if (cnt)
			return (long long)pow((long double)d, (cnt - 1)) * (d - 1)* p[nr];
	}
	return nr - 1;	
}


long long  suma() {
	long long  s = 0 ;
	p[1] = 1;
	for (long i = 2; i <= n; i++) {
		if (prime[i] == 0)
			p[i] = i-1;
		else {

			p[i] = numar(i) ;
		}
		s += p[i];
	}
	return 1 + (s << 1);
} 

int main() {
	citire();
	ofstream out("fractii.out");
	gen_prime();
	out << suma(); 
	out.close();
	return 0;
}