Pagini recente » Cod sursa (job #1842570) | Cod sursa (job #1797293) | Cod sursa (job #880471) | Cod sursa (job #2397981) | Cod sursa (job #1873415)
#include<fstream>
#include <vector>
#include <iostream>
#include <math.h>
using namespace std;
ifstream fin("fractii.in");
ofstream fout("fractii.out");
struct euler
{
bool isPrim;
int indicator;
};
vector<euler> primes;
long long outputSum = 1;
void eulerPrimes(int n)
{
for (int i = 2; i <= n; ++i)
{
for (int j = 2; i*j <= n; ++j)
{
primes[i*j].isPrim = false;
}
}
}
void eulerIndicator(int n)
{
for (int i = 2; i <= n; ++i)
{
if (primes[i].isPrim)
{
primes[i].indicator = i - 1;
}
else
{
int k = 0;
int number = i;
while (number % 2 == 0)
{
number /= 2;
k++;
}
if (k) { primes[i].indicator *= pow(2, k - 1); }
for (int j = 3; j <= i / 2; j += 2)
{
k = 0;
while (number%j == 0)
{
k++;
number /= j;
}
if (k) { primes[i].indicator *= ((j - 1)*pow(j, k - 1)); }
}
}
outputSum += primes[i].indicator * 2;
}
}
int main()
{
int n;
fin >> n;
euler x;
x.isPrim = true;
x.indicator = 1;
for (int i = 0; i <= n; ++i) { primes.push_back(x); }
eulerPrimes(n);
eulerIndicator(n);
fout << outputSum;
}