Pagini recente » Cod sursa (job #696705) | Cod sursa (job #3209089) | Cod sursa (job #2478288) | Cod sursa (job #1723026) | Cod sursa (job #1697886)
#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;
}