NewOJ 題解 [newoj-1040-階乘之和] (Python)
阿新 • • 發佈:2022-01-02
題目描述
求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)