Cod sursa(job #1025268)

Utilizator alabala1vali smerica alabala1 Data 9 noiembrie 2013 18:52:52
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
unsigned a[1000001];
unsigned cmmdc(unsigned i, unsigned j)
{
	if (!i)
		return j;
	if (!j)
		return i;
	return cmmdc(j, i%j);
}
unsigned euleri(unsigned y, unsigned u, unsigned l)
{
	if (y == 1 || u == 1)
	{
		for (int j = l - 2; j >= 2; a[j] = 0, j--);
		return 1;
	}
	if (a[u])
		return euleri(y, u - 1, l);;
	unsigned c = cmmdc(y, u); 
	if (c>1)
	for (unsigned i = u - c; i >= 2; a[i] = 1, i -= c);
	return (c == 1) + euleri(y, u - 1, l);
}
unsigned eulerp(unsigned y, unsigned u, unsigned l)
{
	if (u < 2)
    {
		for (int j = l - 1; j >= 2; a[j] = 0, j--);
		return 1;
	}
	if (a[u])
		return euleri(y,u-1,l);
	unsigned c = cmmdc(y, u);
	if (c >1)
	for (unsigned i = u - c; i >= 2; a[i] = 1, i -= c);
	return (c == 1) + eulerp(y, u - 2, l);
}
void main()
{
	unsigned n, x = 0; 
	/*std::ifstream f("fractii.in");
	f >> n;
	f.close();*/std::cin >> n;
	for (unsigned i = 1; i <= n; i += 2)
		x += euleri(i, i - 1, i - 1) + eulerp(i + 1, i, i);
	x -= (n % 2) ? eulerp(n + 1, n, n) : 0;
	/*std::ofstream g("fractii.out");
	g << x * 2 - 1;
	g.close();*/std::cout << 2 * x - 1;
}