Cod sursa(job #699801)

Utilizator elfusFlorin Chirica elfus Data 29 februarie 2012 21:25:26
Problema Mins Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
//JOS ACTA!

#include <stdio.h>

int x[10000], f[100];

inline bool isPrime (int x)
{
	int d;

	for (d = 3; d * d <= x; d = d + 2)
		if (x % d == 0)
			return 0;
	return 1;
}

int main ()
{
	int c, d, i, j, ci, b, now, ter, now2;
	long long sol = 0;

	freopen ("mins.in", "r", stdin);
	freopen ("mins.out", "w", stdout);

	scanf ("%d%d", &c, &d);
	c --; d --;

	x[++ x[0]] = 2;
	for (i = 3; i * i <= c; i ++)
		if (isPrime (i))
			x[++ x[0]] = i;
	for (i = 1; i <= c; i ++)
	{
		ci = i;
		f[0] = 0;
		for (j = 1; x[j] * x[j] <= ci && x[j]; j ++)
			if (ci % x[j] == 0)
			{
				f[++ f[0]] = x[j];
				while (ci % x[j] == 0)
					ci = ci / x[j];
			}
		if (ci > 1)
			f[++ f[0]] = ci;
		now2 = 0;
		for (j = 1; j < (1 << f[0]); j ++)
		{
			now = 1; ter = 0;
			for (b = 0; b < f[0]; b ++)
				if (j & (1 << b))
					now = now * f[b + 1], ter ++;
			if (ter & 1)
				now2 = now2 + d / now;
			else
				now2 = now2 - d / now;
		}
		sol = sol + d - now2;
	}

	printf ("%lld", sol);
	return 0;
}

//jos actaaaaaaaaaaaaaaaa!!!! sa ma p*s pe el de tratat