Un număr natural nenul m
se numește norocos dacă pătratul lui se poate scrie ca sumă de m
numere naturale consecutive. Un număr natural m
se numește k-norocos, dacă este egal cu produsul a exact k
numere prime distincte. Observați că între cele două proprietăți definite nu există nicio legătură.
Cerința
Dându-se k
și N
numere naturale, scrieți un program care să determine:
a) Cel mai mic și cel mai mare număr norocos dintre cele N
numere citite
Un număr natural nenul m
se numește norocos dacă pătratul lui se poate scrie ca sumă de m
numere naturale consecutive. Un număr natural m
se numește k-norocos, dacă este egal cu produsul a exact k
numere prime distincte. Observați că între cele două proprietăți definite nu există nicio legătură.
Cerința
Dându-se k
și N
numere naturale, scrieți un program care să determine:
a) Cel mai mic și cel mai mare număr norocos dintre cele N
numere citite
b) Câte numere k-norocoase sunt în șirul de N numere citite
Date de intrare
Fișierul de intrare norocos.in
conține pe prima linie un număr natural C
. Pentru toate testele de intrare, numărul C
are una din valorile 1
sau 2
. Pe linia a doua a fișierului se găsesc numerele naturale N
și k
, cu semnificația din enunț, iar pe a treia linie se găsesc N
numere naturale, separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire este norocos.out
.
Dacă C=1
, se va rezolva numai punctul a). În acest caz, în fişierul de ieşire se vor scrie, separate printr-un spațiu, în această ordine, cel mai mic și cel mai mare număr norocos dintre cele N
numere citite. Dacă nu există niciun număr norocos se va afișa valoarea 0
. Dacă există un singur număr norocos, acesta se va afișa de două ori.
Dacă C=2
, se va rezolva numai punctul b). În acest caz, în fişierul de ieşire se va scrie un singur număr reprezentând numărul de numere k-norocoase citite.
Restricții și precizări
1 ≤ N ≤ 1000
2 ≤ k ≤ 30
1 ≤
numerele citite de pe a treia linie a fișierului≤ 2 000 000 000
- Pentru rezolvarea corectă a primei cerinţe se acordă 40 de puncte, pentru rezolvarea corectă a celei de-a doua cerințe se acordă 60 de puncte.
Exemplul 1
norocos.in
1 9 3 165 12 33 30 5 18 105 15 4
norocos.out
5 165
Explicație
Atenție, C=1
, deci se va rezolva doar prima cerință.
Cel mai mic număr norocos este 5
5
2
=25=3+4+5+6+7
Cel mai mare număr norocos este 165
165
2
=27225=83+84+85+…+246+247
Observați faptul că, deși se citește valoarea lui k
, aceasta nu este folosită în rezolvarea cerinței 1.
Exemplul 2
norocos.in
2 5 3 165 31 165 105 44
norocos.out
3
Explicație
Atenție, C=2
, deci se va rezolva doar a doua cerință.
Cele trei numere k-norocoase sunt 165
, 165
, 105
#include <bits/stdc++.h> using namespace std; ifstream cin("norocos.in"); ofstream cout("norocos.out"); int knorocoase(int n) { int d = 2 , cnt = 0; while(n > 1) { int p = 0; while(n % d == 0) p++ , n /= d; if(p == 1) cnt++; else if(p > 1) return 0; d++; if(d *d > n) d = n; } return cnt; } int main() { int cer , n , k , x , min = 2000000001 , max = -2000000001 , cnt = 0; cin >> cer >> n >> k; if(cer == 1) { for(int i = 1 ; i <= n ; i++) { cin >> x; if(x % 2 == 1) { if(x < min) min = x; if(x > max) max = x; } } if(min != 2000000001 && max != -2000000001) cout << min << " " << max; else cout << 0; } else { for(int i = 1 ; i <= n ; i++) { cin >> x; if(knorocoase(x) == k) cnt++; } cout << cnt; } }