3512 - Factorial Query

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 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.