Cod sursa(job #390434)

Utilizator remusmpRemus MP remusmp Data 3 februarie 2010 18:58:16
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <stdio.h>
#include <string.h>
#define MAX 500000

long long tot(int i, char* CIUR)
{
	if (CIUR[i] == 0)
		return i-1;
	long long nr = i;
	for (int k = 2; k <= i/2; k++)
	{
		if (CIUR[k] == 0 && i % k == 0)
		{
			nr /= k;
			nr *= k-1;
		}
	}

	return nr;
}

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

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

	char CIUR[MAX];
	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;
			}
		}
	}

	long long nr = 1;

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

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

	fclose(fin);
	fclose(fout);

	return 0;
}