3630 - codred

De la Universitas MediaWiki

Cerinţa

Se dă n un număr natural. Să se calculeze suma ∑nk=1(k!⋅(k2+k+1)).

Date de intrare

Programul citește de la tastatură numărul n.

Date de ieșire

Programul va afișa pe ecran valoarea sumei, modulo 1.000.000.007.

Restricţii şi precizări

  • 1 ⩽ n ⩽ 10.000.000

Exemplul 1

Intrare
3
Iesire
Datele de intrare corespund restrictiilor impuse
95

Exemplu 2

Intrare
100000000
Iesire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

def factorial(n, mod):
    fact = 1
    for i in range(1, n + 1):
        fact = (fact * i) % mod
    return fact


def compute_sum(n):
    mod = 1000000007
    suma = 0
    for k in range(1, n + 1):
        term = (factorial(k, mod) * (k*k + k + 1)) % mod
        suma = (suma + term) % mod
    return suma


def main():
    n = int(input())

    if n > 10000000:
        print("Datele de intrare nu corespund restrictiilor impuse")
        return

    suma = compute_sum(n)
    print("Datele de intrare corespund restrictiilor impuse")
    print(suma)


if __name__ == "__main__":
    main()

Explicatie

Suma este 1!⋅3+2!⋅7+3!⋅13=3+14+78=95.