Pagini recente » Cod sursa (job #3150362) | Cod sursa (job #1704071) | Cod sursa (job #837536) | Cod sursa (job #2442891) | Cod sursa (job #1697890)
#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;
}