Cod sursa(job #108431)

Utilizator tvladTataranu Vlad tvlad Data 22 noiembrie 2007 17:58:23
Problema Fractii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

const int N = 1000000;
const int NP = 78498;

int prime[NP], np = 0;
int phi[N];

void ciur() {
	const int MX = 1000000;
	bool* pr = (bool*) malloc(sizeof(bool)*(MX+1)); memset(pr,true,sizeof(bool)*(MX-1));
	pr[0] = pr[1] = false;
	for (int i = 2; i <= MX; ++i) {
		if (pr[i]) {
			for (int j = 2; i*j <= MX; ++j) pr[i*j] = false;
			prime[np++] = i;
		}
	}
}

int main() {
	freopen("fractii.in","rt",stdin);
	freopen("fractii.out","wt",stdout);
	
	int n = 0;
	scanf("%d",&n);

	ciur();
	long long s = 1;
	phi[1] = 1;
	for (int i = 2; i <= n; ++i) {
		int p,e,ple,x;
		for (p = 0; p < NP && i % prime[p] != 0; ++p);
		for (x = i, e = 0, ple = 1; x % prime[p] == 0; x /= prime[p], ++e) ple *= prime[p];
		phi[i] = (prime[p]-1)*(ple/prime[p])*phi[x];
		s += 2*phi[i];
	}
	printf("%lld\n",s);
	return 0;
}