4296 - Sum Div

De la Universitas MediaWiki

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.