Cod sursa(job #1025659)

Utilizator alabala1vali smerica alabala1 Data 10 noiembrie 2013 13:46:00
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
unsigned a[999999];
unsigned cmmdc(unsigned i, unsigned j)
{
	while (j)
	{
		unsigned x = j; 
		j = i%j; 
		i = x;
	}
		return i;
}
unsigned euleri(unsigned y, unsigned u, unsigned l)
{
	if (y == 1)
		return 1; 
	if(u == 1)
	{
		for (int j = l ; 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 euleri(y, u - 1, l);
	}
	if (y - u != 1)
	{
		unsigned k = 0;
		for (unsigned i = y - u; i <= u - 1; i *= y - u)
        {
			if (!a[i])
			{
				a[i] = 1;
				k++;
			}
		}
		return k + 1 + euleri(y, u - 1, l);
	}
	return 1 + euleri(y, u - 1, l);
}
unsigned eulerp(unsigned y, unsigned u, unsigned l)
{
	if (u < 2)
	{
		for (int j = l ; j >= 2; a[j] = 0, j--);
		return 1;
	}
	if (a[u])
		return eulerp(y, u - 2, l);
	unsigned c = cmmdc(y, u);
	if (c !=1)
	{
		for (unsigned i = u - c; i >= 2; a[i] = 1, i -= c);
		return  eulerp(y, u - 2, l);
	}
	if (y - u != 1)
	{
		unsigned k = 0;
		for (unsigned i = y - u; i <= u - 1; i *= y - u)
		{
			if (!a[i])
			{
				a[i] = 1;
				k++;
			}
		}
		return k + 1 + eulerp(y, u - 2, l);
	}
	return 1 + eulerp(y, u - 2, l);
}
int main()
{
	unsigned n, x = 0; 
	std::ifstream f("fractii.in");
    f >> n;
    f.close();
	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();
}