Cod sursa(job #1427033)

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

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

#include <vector>

using namespace std;

struct FR
{
	int sus, jos;
};

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

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

			//rezultat = rezultat * (Fractie(div[i], div[i]) - Fractie(1, div[i]));
		}
	}

	rezultat.sus = rezultat.sus * n;
#if CONSOLE_MODE
	cout << "n: " << n << "rezultat: " << rezultat.sus / rezultat.jos << endl;
#endif
	return rezultat.sus / rezultat.jos;
}

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; 
}