1. 程式人生 > >CF 997B Roman Digits

CF 997B Roman Digits

傳送門
題目大意

現在規定羅馬數字只有 4 個字元:I、V、X、L,分別代表 151050。規定:一個羅馬數字的值為該數字包含的字元代表的數字之和,而與字元的順序無關(這與實際情況是不一樣的!)。

問一個長度為 n 的羅馬數字可以有多少種不同的值。顯然答案不會超過 50n,所以不對任何數取模。

n109

思路

考慮生成函式。最 Naive 的想法是:求 (x+x5+x10+x50)n 有多少係數非 0 項,顯然不可做。

注意到,

5×1+1×50=1×5+5×10,就是說五個 1 加上一個 50 等於一個 5 加上五個 10。如果不存在這個結論,即如果一個長度為 n 的羅馬數字的值只對應一個四元組 (x1,x5,x10,x50),那麼答案顯然為 Cn+4141(我靠洛谷垃圾翻譯把 L 寫成 100)。

考慮 5×1+1×50 或者 1×5+5×10。我們規定這種相等的只能取前者,也就是說 x51x105 不能同時成立。那麼考慮分 x5=0x51 兩種情況討論。當

x5=0 時,剩下三種隨便選,對答案的貢獻為 Cn+22。當 x51 時,我們首先列舉 x5 選了多少個,然後列舉 x10 選了多少個,這一部分的方案數為:

x5=1x10=04Cnx5x10+11