切換
舊版
前往
大廳
主題

ZeroJudge - c560: SF 愛運動 解題心得

Not In My Back Yard | 2019-02-20 18:29:49 | 巴幣 0 | 人氣 204

題目連結:


題目大意:
SF可以一次走 1 階或是 3 階的樓梯。而現在給定兩個正整數 n 、 m (1 ≦ n ≦ 100, 000,0 ≦ m < n),代表有一大樓有 n 個階梯且有 m 個休息點。

接著得一列給定 m 個數字(已由小到大排,且皆相異),分別代表 m 個休息點所在的階級。

求從第 0 階走到第 n 階,且經過休息點(一定要站到所在的階梯)的方法數為何?將方法數取除以 1, 000, 000, 007 之後輸出。



範例輸入:
5 1
3


範例輸出:
2


解題思維:
因為要到達每一個休息點,因此我們可以將問題轉成:
從第 0 階走到第 1 個休息點的方法數 × 第 1 個休息點走到第 2 個休息點之方法數 ×
…… × 從第 m 個休息點走到終點的方法數
而每一個小問題都可以看作是經典的費氏數列的變體,遞迴式變成:
= 1、F = 1、F = 1;
= Fn - 1 + Fn - 3 n ≧ 3
用預處理的概念先把 0 ~ 100, 000 的方法數算出來。遇到什麼數字就給出相應的方法數,便可以快速地將上面的小問題整合起來。然後記得每次運算的時候取 1, 000, 000, 007 的餘數即可。



2020 / 11 / 8 更新:「記得運算要取餘數」。因為就連我自己都忘了,但是仍被我賽到可以通過本題的測資XD。感謝Wildfire的提醒。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

Wildfire
我看了一下您的程式碼,這樣建表(ways)不是會溢位嗎@@
我把您的程式碼複製下來後輸出第100000項查看發現是負的@@
2020-11-08 18:53:33
Not In My Back Yard
是的,那樣會溢位。
那時候應該是粗心少寫了取餘的運算,看來這題的測資不夠極端XD

感謝指出錯誤,已更正。
2020-11-08 20:21:23

更多創作