題目連結:
SF可以一次走 1 階或是 3 階的樓梯。而現在給定兩個正整數 n 、 m (1 ≦ n ≦ 100, 000,0 ≦ m < n),代表有一大樓有 n 個階梯且有 m 個休息點。
接著得一列給定 m 個數字(已由小到大排,且皆相異),分別代表 m 個休息點所在的階級。
求從第 0 階走到第 n 階,且經過休息點(一定要站到所在的階梯)的方法數為何?將方法數取除以 1, 000, 000, 007 之後輸出。
因為要到達每一個休息點,因此我們可以將問題轉成:
從第 0 階走到第 1 個休息點的方法數 × 第 1 個休息點走到第 2 個休息點之方法數 ×
…… × 從第 m 個休息點走到終點的方法數
而每一個小問題都可以看作是經典的費氏數列的變體,遞迴式變成:
F0 = 1、F1 = 1、F2 = 1;
Fn = Fn - 1 + Fn - 3 n ≧ 3
用預處理的概念先把 0 ~ 100, 000 的方法數算出來。遇到什麼數字就給出相應的方法數,便可以快速地將上面的小問題整合起來。然後記得每次運算的時候取 1, 000, 000, 007 的餘數即可。
2020 / 11 / 8 更新:「
記得運算要取餘數」。因為就連我自己都忘了,但是仍被我賽到可以通過本題的測資XD。感謝
Wildfire的提醒。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。