Cod sursa(job #1873415)

Utilizator loghin.alexandruLoghin Alexandru loghin.alexandru Data 9 februarie 2017 00:09:27
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb

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