Cod sursa(job #1697890)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 3 mai 2016 04:56:43
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <cmath>
#include <cstring>

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

int sieve[80000];
int sieveSize;


void Sieve(int n){
	int index = 0;
    // Create a boolean array "prime[0..n]" and initialize
    // all entries it as true. A value in prime[i] will
    // finally be false if i is Not a prime, else true.
    bool prime[n+1];
    memset(prime, true, sizeof(prime));
 
    for (int p=2; p*p<=n; p++)
    {
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == true)
        {
            // Update all multiples of p
            for (int i=p*2; i<=n; i += p)
                prime[i] = false;
        }
    }
 
    // Print all prime numbers
    for (int p=2; p<=n; p++){
       if (prime[p]){
          //std::cout << p << " ";
          sieve[index++] = p; 
       }
    }
    sieveSize = index;
   
}
	

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

	int lim = n/2;

	for(int pos = 0 ; pos < sieveSize ; ++pos){
		int i = sieve[pos];
		
		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;
}
long getSum(int n){
	long 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(N);
	

	outfile << getSum(N);

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

}