Cerința
Se dă un șir de n
numere naturale nenule v = {v
1
, v
2
, v
3
... v
n
}
.
Se formează șirul d = {d
1
, d
2
, d
3
... d
n
}
unde d
i
= numărul divizorilor lui v
i
.
Notăm max
= cea mai mare valoare din șirul d
.
Să se afișeze în ordine crescătoare toate numerele din șirul dat v
care au exact max
divizori. Dacă un număr v
i
apare de mai multe ori în șirul v
și numărul divizorilor lui v
i
este egal cu max
, atunci v
i
se va afișa o singură dată.
Date de intrare
Fișierul de intrare masterpiece001.in
conține pe prima linie numărul n
, iar pe a doua linie n
numere naturale nenule separate prin spații.
Date de ieșire
Fișierul de ieșire masterpiece001.out
va conține numerele din șirul dat v
care au exact max
divizori, în ordine crescătoare, separate prin spații.
Restricții și precizări
1 ≤ n ≤ 1.000.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici sau egale cu
400.000
Exemplu
masterpiece001.in
10 12 3 12 4 12 18 31 101 31 31
masterpiece001.out
12 18
Explicație
12
si 18
au 6
divizori. Celelalte numere din șir au mai puțin de 6
divizori. Se observă că numărul 12
apare de două ori, cu toate acestea, se va afișa o singură dată.
#include <bits/stdc++.h> using namespace std; ifstream cin("masterpiece001.in"); ofstream cout("masterpiece001.out"); bitset<400001> a; int nrdiv(int n) { int d = 2 , cnt = 1; int d2=0; while(n%2==0) { d2++; n=n/2;} cnt=d2+1; d=3; while(n > 1) { int p = 0; while(n % d == 0){n/=d;p++;} cnt = cnt * (p+1); d=d+2; if(d * d > n)d = n; } return cnt; } int main() { int n , x , ndmax=0,max = 0 ,min=400000,s=400000,d=0; cin >> n; for(int i = 0 ; i < n ; ++i) { cin >> x; a[x]=1; if(x<s) s=x; if(x>d) d=x; } for(int y=s;y<=d;y++) if(a[y]) { int nd=nrdiv(y); if(nd>ndmax) { ndmax = nd; max=min=y; } else if(nd==ndmax) max=y; } for(int i=min;i<=max;i++) if(a[i] && nrdiv(i)==ndmax) cout<<i<<" "; return 0; }