Pagini recente » Cod sursa (job #1247987) | Cod sursa (job #831927) | Cod sursa (job #1348537) | Cod sursa (job #1270614) | Cod sursa (job #2244641)
#include <fstream>
using namespace std;
ifstream in("fractii.in");
ofstream out("fractii.out");
const int N_MAX = 1000000;
int totient[N_MAX + 1]; //indicatorul lui Euler
///O(N*lnlnN)
void compute_totient(int N) {
//initializare
totient[1] = totient[2] = 1;
for(int i = 3; i <= N; i++)
totient[i] = i - 1;
//ideea de la ciur
for(int i = 2; i <= N; i++) //deja stim valoarea totient[1...i]
for(int j = 2 * i; j <= N; j += i) //scadem pe totient[i] din totient[k * i]
totient[j] -= totient[i];
}
int main() {
int N;
in >> N;
compute_totient(N);
long long sol = 1;
for(int i = 2; i <= N; i++)
sol += 2 * totient[i];
out << sol;
return 0;
}