3512 - Factorial Query

De la Universitas MediaWiki

Cerinţa

Se dau n numere naturale. Să se calculeze produsul factorialelor acestora, modulo 1.000.000.007

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", programul va afișa pe ecran produsul factorialelor celor n numere citite. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n ≤ 1.000.000
  • cele n numere sunt mai mici sau egale cu 10.000.000

Exemple

Exemplul 1

Intrare
4
4 2 1 3
Ieșire
Datele sunt introduse corect.
288

Exemplul 2

Intrare
-5
1 2 3
Ieșire
Datele nu corespund restricțiilor impuse.

Exemplul 3

Intrare
6
1 1 1 1 1 1
Ieșire
Datele sunt introduse corect.
1



Rezolvare

# 3512 - Factorial Query
def validare_date(n, numere):
    # Verificăm dacă n se află între 1 și 1.000.000
    if n < 1 or n > 1000000:
        return False

    # Verificăm dacă fiecare număr din listă este mai mic sau egal cu 10.000.000
    for numar in numere:
        if numar > 10000000:
            return False

    # Datele sunt corecte
    return True


def factorial(n):
    # Returnează factorialul lui n, redus modular la 1.000.000.007
    produs = 1
    for i in range(1, n + 1):
        produs = (produs * i) % 1000000007
    return produs


def main():
    # Citim numărul n de la tastatură
    n_input = input("Introduceti numarul n: ")
    if not n_input:
        print("Introduceti un numar n mai mare decat 0.")
        return
    n = int(n_input)

    # Citim cele n numere de la tastatură
    numere_input = input("Introduceti cele n numere, separate prin spatiu: ")
    if not numere_input:
        print("Introduceti cel putin un numar.")
        return
    numere = list(map(int, numere_input.split()))

    # Validăm datele de intrare
    if not validare_date(n, numere):
        print("Datele nu corespund restricțiilor impuse.")
        return

    # Calculăm produsul factorialelor și îl reducem modular la 1.000.000.007
    produs = 1
    for numar in numere:
        produs = (produs * factorial(numar)) % 1000000007

    # Afișăm rezultatul
    print("Datele sunt introduse corect.")
    print(f"Produsul factorialelor este: {produs}")


if __name__ == "__main__":
    main()

Explicatie

Funcția validare_date(n, numere)

Această funcție primește un număr n și o listă de n numere și verifică dacă acestea corespund restricțiilor impuse. Are următorii parametri:

n - numărul de elemente din listă numere - lista de n numere de verificat Funcția returnează True dacă datele sunt valide și False în caz contrar.

Funcția factorial(n)

Această funcție calculează factorialul unui număr n și returnează valoarea acestuia, redus modular la 1.000.000.007. Are un singur parametru:

n - numărul al cărui factorial trebuie calculat

Funcția main()

Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția citește de la tastatură un număr n și o listă de n numere, verifică dacă datele sunt valide cu ajutorul funcției validare_date(n, numere), calculează produsul factorialelor cu ajutorul funcției factorial(n) și afișează rezultatul la consolă. Dacă datele introduse nu corespund restricțiilor impuse, se afișează un mesaj de eroare.