Cod sursa(job #936200)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 6 aprilie 2013 01:00:02
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h>
#include <algorithm>
#include <map>

using namespace std;

#define MAXN 1010

long long Sum[MAXN];
int Phi[MAXN];
int N;
map<int, long long> Map;

inline void Precalcul()
{
	int i, j;
	for (i = 2; i < MAXN; ++i)
		Phi[i] = i;
	for (i = 2; i < MAXN; ++i)
		if (Phi[i] == i)
			for (j = i; j < MAXN; j += i)
				Phi[j] -= Phi[j] / i;
	for (i = 1; i < MAXN; ++i)
		Sum[i] = Sum[i - 1] + 1LL * Phi[i];
}

long long Nr(int N)
{
	if (N < MAXN)
		return Sum[N];
	if (Map[N])
		return Map[N];
	
	long long Rez = 1LL * N * (N - 1) / 2;
	int st, dr, cat;
	
	st = 2;
	while (st <= N){
		cat = N / st;
		dr = N / cat; 
		Rez -= Nr(cat) * (dr - st + 1);
		st = dr + 1;
	}
	Map[N] = Rez;
	return Rez;
}

int main()
{
	freopen("fractii.in","r",stdin);
	freopen("fractii.out","w", stdout);
	
	scanf("%d", &N);
	Precalcul();
	printf("%lld\n", 2LL * Nr(N) + 1LL);
	
	return 0;
}