Cod sursa(job #1645947)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 10 martie 2016 14:25:31
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int Pmax = 1e3;

int n , i , j;
int phi[Pmax+10];
unordered_map < int , ll > ans;

void bagaphi(int n)
{
    for (i = 1; i <= n; ++i)
        phi[i] = i;
    for (i = 2; i <= n; ++i)
        if (phi[i] == i)
            for (j = i; j <= n; j += i) phi[j] = phi[j] / i * (i - 1);
    for (i = 1; i <= n; ++i)
        phi[i] += phi[i-1];
}

ll solve(int n)
{
    if (n <= Pmax) return phi[n];

    ll ret = ans[n];
    if (ret) return ret;

    ret = 1LL * n * (n + 1) / 2;

    int l , r , d;
    for (l = 2; l <= n; l = r + 1)
    {
        d = n / l;
        r = n / d;

        ret -= 1LL * (r - l + 1) * solve(d);
    }

    ans[n] = ret;
    return ret;
}

int main()
{
    freopen("fractii.in","r",stdin);
    freopen("fractii.out","w",stdout);

    scanf("%d", &n);

    bagaphi(min(Pmax , n));

    printf("%lld\n", 2LL * solve(n) - 1LL);

    return 0;
}