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.
Sa standardnog ulaza se unosi \(N\) (\(1 \leq N \leq 10^6\)).
Na standardni izlaz ispisati vrednost \(\| F_N \|\).
3
5
\(\| F_3 \| = \| \{ 0/1, 1/3, 1/2, 2/3, 1/1 \} \| = 5\).
5
11
\(\| F_5 \| = 1 + \sum_{d = 1}^N \varphi(d) = 1 + (1 + 1 + 2 + 2 + 4) = 11\).
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;
}