Cod sursa(job #65599)

Utilizator nobodybanAna Ban nobodyban Data 11 iunie 2007 02:39:46
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 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;
//	long long  p = nr;
//
//	if ((nr & 1) == 0) {
//		p /=  2;
//		while ((nr & 1) == 0) 
//			nr >>= 1;
//	}
//	for (long d = 3; d <= nr / d; d +=2) {
//
//		if (nr % d == 0 ) {
//			p = p * (d - 1) / d;
//			while (nr % d == 0) nr /= d ;
//		}
//	}
//	if (nr > 1)
//		p = p * (nr - 1) / nr;
//	return p;
//}

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 numar(long nr) {
//	if (prime[nr] == '0')
//		return nr - 1;
//	long long  p = nr;
//	
//	if ((nr & 1) == 0) {
//		p /=  2;
//		p = p * (nr / 2 - 1) / (nr / 2);		
//	}
//	
//	for (long d = 3; d <= nr / d; d +=2) {		
//		if (prime[d] == '0' && nr % d == 0 )
//			p = p * (d - 1) / d;		
//		if (prime[nr / d] == '0' && nr % d == 0 )
//			p = p * (nr / d - 1) / (nr / d);		
//	}	
//	return p;
//}


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;
}