準備藍橋杯也有一段時間了,今天開始準備把做過的有學到一點東西的題目記錄下來,以便日後翻閱。
時間限制: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...