Cod sursa(job #1697886)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 3 mai 2016 04:00:28
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <cmath>
#include <set>
#include <algorithm>
#include <iterator>

std::ifstream infile("fractii.in");
std::ofstream outfile("fractii.out");

std::set<int> sieve; 

std::set<int> Sieve(int n){
	std::set<int> sieve;

	for(int i = 2;i < n; ++i){
        sieve.insert(i);
    }

    for(std::set<int>::iterator loop = sieve.begin();loop != sieve.end();++loop){
        
        int prime = *loop;

        std::set<int>::iterator deleter = loop;
        ++deleter;

        while(deleter != sieve.end()){

            if (((*deleter) % prime) == 0){
                sieve.erase(deleter++);
            }
            else{
                ++deleter;
            }
        }
    }
    return sieve;
}

	

std::unordered_map<int,int> getDivisors(int n){
	int tmp = n;
	std::unordered_map<int,int> toReturn;

	int lim = n/2;

	for(auto iter:sieve){
		int i = iter;
		if(i > lim){
			break;
		}
		
		if(n % i != 0){
			continue;
		}

		toReturn[i] = 0;
		while(n % i == 0){
			toReturn[i]++;
			n = n / i;
		}	
	}
	if(toReturn.empty()){//prime number
		toReturn[tmp] = 1;
	}
	return toReturn;
}
int getPhi(int n){
	std::unordered_map<int,int> divisors;
	divisors = getDivisors(n);
	int phi = 1;
	for(auto iter:divisors){
		phi *= (iter.first - 1) * (int)(pow(iter.first,iter.second-1)); 
	}
	return phi;
}
int getSum(int n){
	int sum = 0;
	for(int i = 2 ; i <= n ; ++i){
		sum += getPhi(i);
	}
	sum *= 2;
	return sum + 1;
}



int main(){
	int N;
	infile >> N;
	std::unordered_map<int,int> divisors;
	sieve = Sieve(N);
	outfile << getSum(N);

	infile.close();
	outfile.close();
	return 0;

}