藍橋杯入門訓練4 Fibonacci數列

2021-10-03 06:25:14 字數 1419 閱讀 5457

準備藍橋杯也有一段時間了,今天開始準備把做過的有學到一點東西的題目記錄下來,以便日後翻閱。

時間限制:1.0s 記憶體限制:256.0mb

fibonacci數列的遞推公式為:fn=fn-1+fn-2,其中f1=f2=1。

當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。

輸入包含乙個整數n。

輸出一行,包含乙個整數,表示fn除以10007的餘數。

1022

557704

1 <= n <= 1,000,000。

剛剛拿到題目的時候沒有注意到資源的要求,於是直接寫了遞迴演算法提交:

`#include 

using

namespace std;

longf(

long n)

intmain()

`

結果當然是執行超時:

遞迴演算法在相對較小的範圍內還是很實用的,但是在n取到40左右的數字時執行時間就有些長了,一百萬的時候就更不用說了。在網路上尋找相關解題方法的時候發現了下面的解法:

#include

using

namespace std;

intmain()

cout<

return0;

}

我嘗試了很多次去理解這段**,但是最終也沒有完全搞明白。看到有人說其實是使用了餘數的加法定理,才稍微有了些頭緒。

餘數的加法定理:a與b的和除以c的餘數,等於a,b分別除以c的餘數之和,或這個和除以c的餘數。即(a+b)%c=(a%c+b%c)%c。

雖然沒搞明白,但是這種方法毫無疑問是接近最佳答案的,它的cpu時間為0ms,記憶體使用僅為2.449mb。

之後我又想到使用陣列來存放每乙個fn%10007的結果,輸入n後直接讀取也可以解決問題。

#include

using

namespace std;

long

long a[

1000000];

void

fibo()

}int

main()

這種方法的兩項指標都比上一種差,但是更容易理解(也許是我太菜了理解不來上一種的原因┭┮﹏┭┮)。

入門訓練的四道題目難度都不大,但是確實把需要注意的點都顧及到了,算是基礎中的基礎吧。

第一次寫浪費了太多時間在小細節上,但總算是把做題時的想法都顧及到了。之後遇到值得記錄的題目再繼續寫叭。

藍橋杯入門訓練

1.a b問題 include int main 2.序列求和問題 include int main 3.圓的面積問題 include include define pi atan 1.0 4 int main 4.fibonacci數列 include int main 注意陣列的長度100000...

藍橋杯 入門訓練

begin 1 a b問題 include using namespace std inta,b intmain view code begin 2 序列求和 include using namespace std long long n long long ans 0 int main view ...

藍橋杯入門訓練 藍橋杯備賽

begin 1 a b問題str1 input str2 str1.split s int str2 0 int str2 1 print s begin 2 序列求和s int input 用公式計算而不用迴圈,避免超時 n s s 1 2print int n begin 3 圓的面積impor...