Cerința
Gigel a găsit un șir cu n
numere naturale, numerotate de la 1
la n
și un număr p
. Neavând chef de muncă, Gigel vă cere să rezolvați următoarele cerințe:
a) Aflați câți divizori are numărul din șir aflat pe poziția p
.
Cerința
Gigel a găsit un șir cu n
numere naturale, numerotate de la 1
la n
și un număr p
. Neavând chef de muncă, Gigel vă cere să rezolvați următoarele cerințe:
a) Aflați câți divizori are numărul din șir aflat pe poziția p
.
b) Afișați în ordine descrescătoare numerele din șir care au același număr de divizori ca cel aflat pe poziția p
.
Date de intrare
Fișierul de intrare divizori4.in
conține pe prima linie numerele n c
, unde c
poate fi doar 1
sau 2
. A doua linie conține cele n
elemente ale șirului. A treia linie conține numărul p
.
Date de ieșire
Dacă c=1
se rezolvă numai cerința a). Fișierul de ieșire divizori4.out
va conține pe prima linie numărul de divizori ai numărului aflat în șir pe poziția p
.
Dacă c=2
se rezolvă numai cerința b). Fișierul de ieșire divizori4.out
va conține pe prima linie, în ordine descrescătoare, numerele din șir cu același număr de divizori ca și cel aflat pe poziția p
.
Restricții și precizări
- numerele din șir vor fi numere naturale nenule mai mici sau egale cu
1.000.000.000
- pentru 50% din punctaj
c=1
; pentru 50% din punctajc=2
; - pentru
c=1
,1 ≤ p ≤ n ≤ 50.000
- pentru
c=2
,1 ≤ p ≤ n ≤ 50.000
pentru 30% din punctaj și1 ≤ p ≤ n ≤ 10.000
pentru 20% din punctaj
Exemplul 1
divizori4.in
10 1 1 5 95 23 16 39 77 74 97 57 3
divizori4.out
4
Explicație
c=1
, se rezolvă doar cerința a). Al treilea număr din șir este 95
, care are 4
divizori (1 5 19 95
).
Exemplul 2
divizori4.in
10 2 1 5 95 23 16 39 77 74 97 57 3
divizori4.out
95 77 74 57 39
Explicație
c=2
, se rezolvă doar cerința b). Al treilea număr din șir este 95
, care are 4
divizori. Numerele cu 4
divizori din șir sunt, în ordine descrescătoare: 95 77 74 57 39
.
#include <bits/stdc++.h> using namespace std; ifstream fin("divizori4.in"); ofstream fout("divizori4.out"); int P[200000],np; bool E[1000001]; void ciur(bool E[], int n) {//ciurul lui Eratostene for(int i=2;i<=n;i++) E[i]=1; for(int i=2;i*i<=n;i++) if(E[i]==1) for(int j=i*i;j<=n;j=j+i) E[j]=0; } void prime(int n, int P[], int &np) {//numerele prime pana la n np=0; for(int i=2;i<=n;i++) if(E[i]==1) P[++np]=i; } int nrdiv(int n) { int d=1,c=1; while(n>1) { if(n%P[d]==0) { int p = 0; while(n%P[d]==0) n=n/P[d], ++p; c*=(p+1); } else ++d; if(n>1 && P[d]*P[d]>n) { return 2*c; } } return c; } int v[50001]; int main() { ios::sync_with_stdio(false); ciur(E,1000001); prime(1000001,P,np); int n, c, p; fin>>n>>c; for(int i=1;i<=n;++i) fin>>v[i]; fin>>p; if(c==1) {fout<<nrdiv(v[p]); return 0;} else{ int nd = nrdiv(v[p]); sort(v+1, v+n+1); for(int i=n;i>0;--i) if(nrdiv(v[i]) == nd) fout<<v[i]<<' '; } return 0; }