Cod sursa(job #390457)

Utilizator remusmpRemus MP remusmp Data 3 februarie 2010 19:48:14
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <string.h>

#define MAX 1000002

char CIUR[MAX];
int t[MAX];

long long tot(int i)
{
	if (t[i])
		return t[i];

	if (CIUR[i] == 0)
	{
		t[i] = i-1;
		return i-1;
	}

	for (int k = 2; k <= i/2; k++)
	{
		if (CIUR[k] == 0 && i % k == 0)
		{
			int p = k;
			while (i % p == 0)
			{
				p *= k;
			}

			p /= k;

			int a = i / p;
			t[i] = t[p]*t[a];

			break;
		}
	}

	return t[i];
}

int main()
{
	FILE* fin = fopen("fractii.in", "r");
	FILE* fout = fopen("fractii.out", "w");

	int N;
	fscanf(fin, "%d", &N);

	
	memset(CIUR, 0, (N+1)*sizeof(char));

	int limi = N+1;
	for (int i = 2; i <= limi; i++)
	{
		if (CIUR[i] == 0)
		{
			int limj = limi / i + 1;
			for (int j = 2; j < limj; j++)
			{
				CIUR[i*j] = 1;
			}

			if (i <= 1000)
			{
				long p = i*i;
				while (p <= N)
				{
					t[p] = (i-1)*p/i;
					p *= i;
				}
			}
		}
	}

	long long nr = 1;

	for (int i = 2; i <= N; i++)
	{
		nr += 2*tot(i);
	}

	fprintf(fout, "%lld", nr);

	fclose(fin);
	fclose(fout);

	return 0;
}