Cod sursa(job #203689)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 august 2008 15:51:19
Problema Fractii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>

#define d5 13
#define d10 1000005

int i, j, k, p, c, v;

int care[d10][d5], paritate[d10], cate[d10];

unsigned long long ans, N;

void read()
{
	freopen("fractii.in","r", stdin);

	scanf("%llu", &N);
}

void solve()
{
	ans = N * (N-1) + 1;

	for (i = 2; i <= 2; ++i)
	 for (j = i; j <= N; j += i)
		 care[j][++care[j][0]] = i;

	for (i = 3; i <= N; i += 2)
		if (care[i][0] == 0)
			for (j = i; j <= N; j += i)
				care[j][++care[j][0]] = i;

	for (i = 2; i <= N; ++i)
		for (j = 1; j < (1<<care[i][0]); ++j)
		{
			for (p = 1, c = 0, v = 1, k = j; v <= care[i][0] && k; k >>= 1, ++v)
				if (k & 1)
				{
					p *= care[i][v];
					c++;
				}
			paritate[p] = (c & 1);
			++cate[p];
		}

	for (p = 2; p <= N; ++p)
		if (cate[p])
		{
			if (paritate[p])
				ans -= cate[p] * (cate[p]-1);
			else
				ans += cate[p] * (cate[p]-1);
		}
}

void write()
{
	freopen("fractii.out", "w", stdout);

	printf("%llu\n", ans);
}

int main()
{
	read();

	solve();

	write();

	return 0;
}