題目連結:
題目大意:
給定兩正整數 n 、 m (1 ≦ n ≦ 10, 000, 000 、 1 ≦ m ≦ 1, 000, 000, 000),代表有 n 件工作,編號依序為 1 ~ n 。
而現在 L 小姐想完成這 n 件工作。但是按照她的個性,當完成了編號為 i 的工作,一定不會緊接著去完成第 i + 1 個工作。
求 L 小姐有多少方法(順序)完成這 n 件工作。將方法數取除以 m 的餘數。
典型的數學上之遞迴的問題,也是程式解題經典的動態規劃題。
假設已經知道完成 i 件和 i - 1 件工作的方法數(以下稱 Di 、 Di - 1 ),則我們可以觀察出 i + 1 件工作的方法數有以下的規律:
當第 i + 1 件工作不是第 i + 1 個完成時,我們可以從剩下的 i 件工作選出 i 個縫隙去插入這個工作(已扣除最後的位置)。因此有 Di × i 種方法。
而第 i + 1 件工作是第 i + 1 個完成時,第 i 個工作不能是第 i 個完成的(會跟規則衝突)。與上同理,會有 Di - 1 × (i - 1)種方法。
因此我們總合以上的可能性,得出:
Di + 1 = Di × i + Di - 1 × (i - 1)。
且已知 D1 = 1 、 D2 = 1 ,因此我們可以推得 Dn 。剩下的就只要每次做運算時,去取 m 的餘數即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。