Farejeva sekvenca

Farejeva sekvenca reda \(N\), označena sa \(F_N\), sastoji se od svih razlomaka \(\frac{a}{b}\) iz intervala \([0, 1]\) takvih da je \(0 \leq a \leq b \leq N\) i \(NZD(a, b) = 1\). Poznato je da je broj elemenata u \(F_N\) jednak:

\[\| F_N \| = 1 + \sum_{d = 1}^N \varphi(d),\]

gde je \(\varphi\) Ojlerova funkcija.

Opis ulaza

Sa standardnog ulaza se unosi \(N\) (\(1 \leq N \leq 10^6\)).

Opis izlaza

Na standardni izlaz ispisati vrednost \(\| F_N \|\).

Primer 1

Ulaz

3

Izlaz

5

Objašnjenje

\(\| F_3 \| = \| \{ 0/1, 1/3, 1/2, 2/3, 1/1 \} \| = 5\).

Primer 2

Ulaz

5

Izlaz

11

Objašnjenje

\(\| F_5 \| = 1 + \sum_{d = 1}^N \varphi(d) = 1 + (1 + 1 + 2 + 2 + 4) = 11\).

Rešenje

Opis glavnog rešenja

U ovom bloku se opisuje glavno rešenje zadatka.

#include <iostream>

using namespace std;

int phi(int n) {
    int d = 2;
    int proizvod = n;
    while (d*d <= n) {
        if (n % d == 0) {
            proizvod = (proizvod / d) * (d - 1);
            while (n % d == 0)
                n /= d;
        }
        d++;
    }
    if (n > 1)
        proizvod = (proizvod / n) * (n - 1);

    return proizvod;
}

int farey(int N)
{
    int sum = 1;
    for (int d = 1; d <= N; d++) {
        sum += phi(d);
    }
    return sum;
}

int main() 
{
    int N; cin >> N;

    cout << farey(N) << endl;

    return 0;
}
#include <iostream>

using namespace std;

int nzd(int a, int b) {
    while (b > 0) {
        int tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

int phi(int n) {
    int broj = 0;
    for (int i = 1; i <= n; i++)
        if (nzd(i, n) == 1)
            broj++;
    return broj;
}

int farey(int N)
{
    int sum = 1;
    for (int d = 1; d <= N; d++) {
        sum += phi(d);
    }
    return sum;
}

int main() 
{
    int N; cin >> N;

    cout << farey(N) << endl;

    return 0;
}