Cod sursa(job #68681)

Utilizator zobicaMarin Marin zobica Data 29 iunie 2007 01:54:58
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <math.h>
#include <fstream>
using namespace std;

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

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

void eratostene(){
	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){
	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();
	eratostene();
	ofstream out("fractii.out");
	out << suma(); 
	out.close();
	return 0;
}