Cerința
Indicatorul lui Euler, φ(n)
– uneori numită funcția phi, este folosit pentru a determina câte numere mai mici decât n
sunt relativ prime cu n
. De exemplu, cum 1
, 2
, 4
, 5
, 7
și 8
sunt toate mai mici decât 9
și relativ prime la 9
, φ(9)=6
.
n | Relativ prime | φ(n) | n/φ(n) |
2 | 1 | 1 | 2 |
3 | 1,2 | 2 | 1.5 |
4 | 1,3 | 2 | 2 |
5 | 1,2,3,4 | 4 | 1.25 |
6 | 1,5 | 2 | 3 |
7 | 1,2,3,4,5,6 | 6 | 1.1666…. |
8 | 1,3,5,7 | 4 | 2 |
9 | 1,2,4,5,7,8 | 6 | 1.5 |
10 | 1,3,7,9 | 4 | 2.5 |
Se poate vedea că n=6
produce valoarea maximă n/φ(n)
pentru n ≤ 10
.
Se consideră un șir de numere naturale mai mari decât 1
, numere formate din cel mult 9
cifre. Să se scrie un program care determină dintre acestea numărul n
pentru care raportul n/φ(n)
are valoare maximă. În cazul în care sunt mai multe valori pentru care raportul n/φ(n)
este maxim se va afișa prima dintre ele.
Date de intrare
Fișierul de intrare maxprimeintreele.in
conține pe prima linie cel mult 10000
numere naturale din intervalul [2,999999999]
separate prin spații.
Date de ieșire
Fișierul de ieșire maxprimeintreele.out
va conține pe prima linie numărul k
, reprezentând numărul n
pentru care raportul n/φ(n)
are valoare maximă.
Restricții și precizări
- numerele din fișierul de intrare sunt din intervalul
[2, 999999999]
Exemplu
maxprimeintreele.in
2 3 4 5 6 7 8 9 10
maxprimeintreele.out
6
Explicație
Dintre numerele aflate în fișierul de intrare, numărul 6
are raportul n/φ(n)
cu valoare maximă și anume 3
.
#include <bits/stdc++.h> using namespace std; ifstream cin("maxprimeintreele.in"); ofstream cout("maxprimeintreele.out"); double maxi = 0; int nrmaxi; long Totient(long nr) { long i,rank = nr; if(nr==1) return 0; if (!(nr%2)) { rank -= rank/2; while(!(nr%2)) nr /= 2; } for (i = 3; i*i <= nr; i += 2) if (!(nr%i)) { rank -= rank/i; while (!(nr%i)) nr /= i; } if (nr>1) rank -= rank/nr; return rank; } int main(){ int x; while(cin >> x){ if((double) x / Totient(x) > maxi) maxi = (double) x / Totient(x), nrmaxi = x; } cout << nrmaxi; return 0; }