c560: SF 愛運動
c560: SF 愛運動
題目連結:c560: SF 愛運動
題意:
第一行共兩個數字n,m(1<=n<=100000,0<=m<n),分別代表 101 大樓的階梯總數及休息站的數量。
接下來一行共 m 個數字 a[i](1<= a[i]< n),代表每個休息站所在的階梯,且a[i]<a[i+1]。
SF可以一次走1階或走3階,請輸出SF完成比賽的方法數並 mod 1000000007。
解法:
因為每個休息點都要走到,所以我們可以把問題簡化成:
(從起點走到第一個休息點的方法數)*(從第一個休息點走到第二個休息點的方法數)*(從第二個休息點走到第三個休息點的方法數)*......*(從第m個休息點走到終點的方法數)。
我們仔細觀察後可以發現方法數是費氏數列的變形。
F[0]=1
F[1]=1
F[2]=1
F[N]=(F[N-1]+F[N-3])%1000000007
Python:
time:0.2s
memory used:14.5MB
code:
- f=[1,1,1]
- for i in range(3,100001):
- f.append((f[i-1]+f[i-3])%1000000007)
- ans=1
- start=0
- a,b=input().split()
- a=int(a)
- b=int(b)
- line=input().split()
- for i in range(b):
- x=int(line[i])
- ans=(ans*f[x-start])%1000000007
- start=x
- ans=(ans*f[a-start])%1000000007
- print(ans)
本人的分享到此結束
若有更好的想法或建議,請在留言區留言喔
正確來說他不是Divide and Conquer(?)
ReplyDelete應該是DP(?)
原來是我理解錯了嗎?
Delete感謝學長指教~
然後順便多教你一點東西
Delete你會矩陣嗎
如果會這題可以優化到O(m lg n)
還算是會一點(吧?)
Delete