#45297: 動態規劃(DP)題


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-05-10 17:41:09
c055. 00568 - Just the Facts -- UVa568 | From: [123.192.228.253] | 發表日期 : 2025-02-08 14:41

如果想計算一個很大的數字的話,可以試試這個網站: 階乘計算機

它應該可以幫你 debug

 

這題適用 dp 的原因是計算階乘時,我們不希望讓程式重新算已經算過的東西,而階乘就完全符合條件

階乘的公式: n! = n * (n-1)!

每一項的結果都和前一項有關

不用 dp 的話...應該會算到天荒地老

 

但這依然有些許問題,20! 的數字大小就已經超過 long long 的範圍了,而這題最大可能是 100000! ,有 35660 位數,還沒動手就可以預見 MLE 了,硬算顯然不理智,所以我們要取模,取多少呢?

數字取大了,算的速度就慢,也有 MLE 的風險,數字小了又會丟失精度

先說答案: 這題應該取 100000,保留五位數字

 

在這題中,我們只關注從右邊數過來第一個不是 0 的數字

你可以跑一個 while 循環一直將數字除以 10 取整數,直到 mod 10 不為 0 為止,這樣就可以讓數字右側沒有 0

python 也可以把得到的數字轉成 str 後 rstrip('0') ,再轉回 int

這樣就可以忽略 0 的部分了

 

對於 n! 的結果,題目提到 n 最大為 100000,所以我們就只需要將每個結果 mod 10000 就可以了,這樣就可以在避免大數運算的同時,保持最後五位數數字的精度

 

狀態轉移公式: dp[n] = (n * dp[n-1] ->去掉右側多餘的0 ) % 100000

 

最後只需要查表即可

 

參考答案: gist(python)

 

 
ZeroJudge Forum