4296 - Sum Div

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinţa

Se dă un șir de n numere naturale nenule și de asemenea un număr natural p. Să se calculeze suma numerelor din șir care au cel puțin p divizori.

Date de intrare

Programul citește de la tastatură numerele nr și p, iar apoi șirul de n numere naturale, separate prin spații.

Date de ieşire

Programul va afișa pe ecran numărul suma, reprezentând suma numerelor din șir care au cel puțin p divizori.

Restricții și precizări

  • nr ∈ Ν
  • 1 ⩽ nr ⩽ 100.000
  • 1 ⩽ p ⩽ 100.000
  • cele n numere din șir vor fi numere naturale nenule mai mici decât 1.000.000

Exemplu1

Intrare
5 3
7 4 10 17 1
Ieșire
Datele de intrare corespund restricțiilor impuse.
14

Explicație

Numerele din șir care au cel puțin 3 divizori sunt 4 și 10, iar suma lor este 14.

Exemplu2

Intrare
5 100
5 12 24 3 72
Ieșire
Datele introduse corespund restricțiilor impuse.
0

Explicație

Niciun număr nu are cel puțin 100 de divizori, deci suma este 0.

Rezolvare

import math


def validare_date(nr, p, n):
    flag = False
    if 0 <= int(nr) <= 1_000 and 1 <= int(p) <= 1_0000:
        flag = all(isinstance(x, int) and 1 <= x <= 1_000_000 for x in n)
    return flag


def nrdiv(n):
    cnt = 0
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            cnt += 2
        if i * i == n:
            cnt -= 1
    return cnt


def suma_p_divizori(n, p):
    suma = 0
    for i in n:
        if nrdiv(i) >= p:
            suma += i
    return suma


if __name__ == '__main__':
    nr, p = map(int, input().split())
    n = list(map(int, input().split()))
    if validare_date(nr, p, n):
        print("\nDatele de intrare corespund restricțiilor impuse.\n")
        suma = suma_p_divizori(n, p)
        print(suma)
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")

Explicație

Codul calculează suma numerelor dintr-o listă dată, care au cel puțin p divizori. Datele de intrare sunt primite de la utilizator și sunt validate prin funcția validare_date(). Funcția nrdiv() calculează numărul de divizori ai unui număr dat, iar funcția suma_p_divizori() calculează suma numerelor din listă care au cel puțin p divizori. Dacă datele de intrare corespund restricțiilor impuse, se afișează suma calculată, altfel se afișează un mesaj corespunzător.