Cod sursa(job #2083698)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 7 decembrie 2017 23:55:32
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef long double ld;

inline void debugMode() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    #ifndef ONLINE_JUDGE
    freopen("fractii.in", "r", stdin);
    freopen("fractii.out", "w", stdout);
    #endif // ONLINE_JUDGE
}
inline void PrintYes() { cout << "Yes"; }
inline void PrintNo() { cout << "No"; }

const double eps = 1e-7;

int Euler[1000005];
bool notPrime[1000005];
/// folosim Euler's totiem care ne va spune:
/// Euler[i] = numarul de numere prime care sunt mai mici sau egale cu i si au gcd(numar, i) = 1
/// notPrim[i] = true => elementul i nu este prim

int main()
{
	debugMode();

	int n;

    cin >> n;

    /// calculam pentru fiecare cu scrierea sub forma de produs a formulei lui Euler
    /// Euler[n] = n * prod(1 - 1 / p) -> unde p este un numar prim din desc lui n

    for(int i = 2; i <= n; ++i)
        Euler[i] = i;

    for(int i = 2; i <= n; i += 2)
        Euler[i] -= Euler[i] / 2;

    for(int i = 3; i <= n; i += 2) {
        if(notPrime[i] == true)
            continue;

        for(int j = i ; j <= n; j += i) {
            notPrime[j] = true;
            Euler[j] -= Euler[j] / i;
        }
    }

    ll ans = 0;

    for(int i = 2; i <= n; ++i)
        ans += Euler[i];

    cout << 2 * ans + 1;

	return 0;
}