Cod sursa(job #108435)

Utilizator tvladTataranu Vlad tvlad Data 22 noiembrie 2007 18:18:57
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

const int N = 1000010;
const int NP = 78498;

int fp[N], fple[N], fprem[N], 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]) {
			fp[i] = fple[i] = i; fprem[i] = 1;
			for (int j = 2; i*j <= MX; ++j) {
				pr[i*j] = false;
				fp[i*j] = i;
				fple[i*j] = i;
				for (fprem[i*j] = j; fprem[i*j] % i == 0; fprem[i*j] /= i, fple[i*j] *= 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) {
		phi[i] = (fp[i]-1)*(fple[i]/fp[i])*phi[fprem[i]];
		s += phi[i] << 1;
	}
	printf("%lld\n",s);
	return 0;
}