Cod sursa(job #1426987)

Utilizator DRaduDaniel Radu DRadu Data 1 mai 2015 11:20:29
Problema Fractii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
//#define CONSOLE_MODE 1

#if CONSOLE_MODE
#include <iostream>
#else
#include <fstream>
#endif

#include <vector>

using namespace std;

class Fractie
{
public:
	int sus, jos;

	Fractie(int a, int b)
	{
		sus = a;
		jos = b;
	}

	Fractie()
	{
		sus = 1; jos = 1;
	}

	Fractie operator*(Fractie f2)
	{
		Fractie rez;
		rez.sus = this->sus * f2.sus;
		rez.jos = this->jos * f2.jos;
		return rez;
	}

	Fractie operator*(int integer)
	{
		Fractie rez;
		rez.sus = this->sus * integer;
		rez.jos = this->jos;
		return rez;
	}


	//valabil doar pentru cele cu nnumitorul comun 
	Fractie operator-(Fractie f2)
	{
		Fractie rez;
		rez.sus = this->sus - f2.sus;
		rez.jos = this->jos;
		return rez;
	}

	int getInt()
	{
		return sus / jos;
	}
};

int euler(int n, vector<int> &div)
{
	Fractie rezultat;
	rezultat.sus = 1; rezultat.jos = 1;

	for (int i = 0; i < div.size(); i++)
	{
		if (n % div[i] == 0)
			rezultat = rezultat * (Fractie(div[i], div[i]) - Fractie(1, div[i]));
	}

	rezultat = rezultat * n;
#if CONSOLE_MODE
	cout << "n: " << n << "rezultat: " << rezultat.getInt() << endl;
#endif
	return rezultat.getInt();
}

int rezolva(int n)
{
	bool *ciur;
	ciur = new bool[n+1];
	vector<int> nrPrime;

	int total = 0;

	for (int i = 0; i < n; i++)
		ciur[i] = true;

	for (int i = 1; i <= n; i++)
	{

		if (ciur[i] && i != 1)
			nrPrime.push_back(i);

		total += euler(i, nrPrime);

		

		int mult = 2;

		while (mult * i <= n && i > 1)
		{
			ciur[i * mult] = false;
			mult++;
		}
	}

	delete[] ciur;

	return total * 2 - 1;
}

int main()
{
	int n;

#if CONSOLE_MODE
	std::cin >> n;
#else
	ifstream IN("fractii.in");
	IN >> n;
	IN.close();
#endif

#if CONSOLE_MODE
	cout << rezolva(n) << endl;
	system("pause");
#else
	ofstream OUT("fractii.out");
	OUT << rezolva(n) << endl;
	OUT.close();
#endif
	return 0; 
}