Cerința
Aky și Alex joacă un joc interesant. Acesta se desfășoară în felul următor: aceștia au cartonașe cu numere naturale până la 10.000.000
(se consideră că au un număr infinit de cartonașe pentru fiecare număr natural mai mic sau egal cu 10.000.000
). Ei aleg la întâmplare n
cartonașe din cele date, iar pentru fiecare număr x
de pe un cartonaș ales caută cartonașul pe care se află scris cel mai mare divizor prim al numărului x
.
Astfel observă că pentru multe din numerele alese cel mai mare divizor prim coincide, deci se hotărăsc să creeze mai multe perechi de cartonașe astfel: primul cartonaș al perechii va fi un număr prim, P
, care este cel mai mare divizor prim al cel puțin unuia dintre numerele alese, iar numărul C
de pe al doilea cartonaș reprezintă pentru câte din numerele din șirul numerelor alese numărul de pe primul cartonaș este cel mai mare divizor prim. De asemenea, perechile sunt ordonate crescător după P
.
Cei doi băieți nu se descurcă singuri când numerele de pe cartonașe sunt foarte mari, deci vă roagă pe voi să realizați un program care să realizeze afișarea numarului de perechi formate precum și a acestora pentru un șir de n
cartonașe alese.
Date de intrare
Fișierul de intrare jocprim.in
conține pe prima linie numărul n
, iar pe a doua linie n
numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire jocprim.out
va conține pe prima linie numărul de perechi formate, iar pe următoarele linii, câte o pereche de numere P
și C
, separate printr-un spațiu, cu semnificațiile din enunț.
Restricții și precizări
1 ≤ n ≤ 20000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât
10.000.000
Exemplu
jocprim.in
12 6 8 3 4 24 20 25 26 30 15 18 22
jocprim.out
5 2 2 3 4 5 4 11 1 13 1
Explicație
2
este cel mai mare divizor prim a 2
numere din fișierul de intrare, 3
și 5
a 4
numere, iar 11
și 13
a câte unui număr.
#include <bits/stdc++.h> using namespace std; ifstream cin("jocprim.in"); ofstream cout("jocprim.out"); int n , x , cnt , f[10000001] , maxi , cate; int divprim(int n) { int d = 2 , rez; while(n > 1) { int p = 0; while(n % d == 0) n /= d , p++; if(p) rez = d; d++; if(d * d > n) d = n; } return rez; } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) { cin >> x; f[divprim(x)]++; maxi = max(maxi , divprim(x)); } for(int i = 1 ; i <= maxi ; i++) if(f[i]) cate++; cout << cate << '\n'; for(int i = 1 ; i <= maxi ; i++) if(f[i]) cout << i << " " << f[i] << '\n'; return 0; }