Pagini recente » Cod sursa (job #1803653) | Cod sursa (job #994889) | Cod sursa (job #2680212) | Cod sursa (job #562606) | Cod sursa (job #2005557)
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <queue>
#include <stack>
#include <vector>
#define ll long long
#define ull unsigned long long
#define pb push_back
using namespace std;
ifstream in("fractii.in");
ofstream out("fractii.out");
const int NMax = 1e6 + 5;
const int inf = 1e9 + 5;
int N;
int phi[NMax];
bool notPrime[NMax];
// phi[i] = Euler's totient function pentru i
// adica numarul de numere x mai mici sau egale cu i
// si care au gcd(x,i) = 1
// notPrime[i] = true daca numarul i nu este prim
int main() {
in>>N;
// se calculeaza phi[i] prin formula de produs a lui Euler
for (int i=2;i <= N;++i) {
phi[i] = i;
}
// daca Pi este un numar prim din descompunerea lui x,
// atunci phi(x) = x * prod(1 - 1/Pi), lucru care este echivalent cu
// phi(x) = x si, phi(x) = phi(x) - phi(x)/Pi, pentru fiecare Pi;
for (int i=2;i <= N;i += 2) {
phi[i] -= phi[i]/2;
}
for (int i=3;i <= N;i += 2) {
if (notPrime[i]) {
continue;
}
for (int j=i;j <= N;j += i) {
notPrime[j] = true;
phi[j] -= phi[j]/i;
}
}
ll ans = 0;
for (int i=2;i <= N;++i) {
ans += phi[i];
}
out<<ans*2 + 1<<'\n';
in.close();out.close();
return 0;
}