Pagini recente » Cod sursa (job #2540968) | Cod sursa (job #176776) | Cod sursa (job #2488950) | Cod sursa (job #2287166) | Cod sursa (job #1697891)
#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;
}*/
std::unordered_map<int,int> getDivisors(int n){
// Print the number of 2s that divide n
std::unordered_map<int,int> toReturn;
while (n%2 == 0)
{
toReturn[2]++;
n = n/2;
}
int pos = 0;
// n must be odd at this point. So we can skip one element (Note i = i +2)
for (int i = sieve[0]; i <= sqrt(n); i = sieve[++pos]){
// While i divides n, print i and divide n
while (n%i == 0)
{
toReturn[i]++;
n = n/i;
}
}
// This condition is to handle the case whien n is a prime number
// greater than 2
if (n > 2){
toReturn[n] = 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/2 + 1);
outfile << getSum(N);
infile.close();
outfile.close();
return 0;
}