1. 程式人生 > 其它 >NewOJ 題解 [newoj-1040-階乘之和] (Python)

NewOJ 題解 [newoj-1040-階乘之和] (Python)

題目連結

題目描述

求1!+2!+3!+...+n!,由於答案很大,答案對998244353求餘即可。

輸入格式

輸入存在多組測試資料,對於每組測試資料輸入一個正整數n(1<=n<=10^6)

輸出格式

對於每組測試資料輸出一行表示答案。

輸入樣例

1
5

輸出樣例

1
153

思路

這道題,想必大家都知道如何計算,如果在測試資料量比較小的情況下,按照我們原來的方法是沒有錯的,但是當資料量比較大的情況下,我們原來的那樣計算方法,會大大的增加執行時間。解決這道題的核心就是用空間換時間,將之前每次的測試資料的結果都存下來,當下一次再來一條測試資料的時候,如果x小於等於lc我們只需要從陣列中取出該條資料即可,如果x大於lc,我們接著第lc次的結果繼續運算,並將每次的結果存下來,知道計算出最終結果。

程式碼實現

import sys
lsu = [1]
ls = [1]
lc = 1
for line in sys.stdin:
    x = eval(line)
    if x <= lc:
        print(lsu[x-1])
    else:
        s = ls[lc-1]
        su = lsu[lc-1]
        for i in range(lc+1,x+1):
            s = (s*i)%998244353
            su = (su+s)%998244353
            ls.append(s)
            lsu.append(su)
            lc += 1
        print(lsu[lc-1])

時間複雜度: O(n)

空間複雜度: O(n)