Pagini recente » Cod sursa (job #1311455) | Istoria paginii implica-te/extinde-arhiva/autor-necunoscut | Cod sursa (job #1710788) | Cod sursa (job #2696178) | Cod sursa (job #1426987)
//#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;
}