【藍橋杯】BEGIN-4 Fibonacci數列
- 2019 年 11 月 8 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_42449444/article/details/86562090
題目描述:
Fibonacci數列的遞推公式為:Fn=Fn-1+Fn-2,其中F1=F2=1。
當n比較大時,Fn也非常大,現在我們想知道,Fn除以10007的餘數是多少。
輸入格式:
輸入包含一個整數n(1 <= n <= 1,000,000)。
輸出格式:
輸出一行,包含一個整數,表示Fn除以10007的餘數。
說明:在本題中,答案是要求Fn除以10007的餘數,因此我們只要能算出這個餘數即可,而不需要先計算出Fn的準確值,再將計算的結果除以10007取餘數,直接計算餘數往往比先算出原數再取余簡單。
輸入樣例1:
10
輸出樣例1:
55
輸入樣例:
22
輸出樣例:
7704
解題思路:
這TM不就是一道無腦遞歸的水題嗎?誒?!提交之後居然TLE 對不起 是我小瞧這道題了。沒那麼簡單~ 既然不能無腦遞歸,就老老實實地按照題目意思來吧。
AC程式碼:TLE程式碼:
#include <bits/stdc++.h> using namespace std; int Fib(int n) { if(n == 1 || n == 2) { return 1; } return Fib(n-1)+Fib(n-2); } int main() { int n; scanf("%d",&n); printf("%dn",Fib(n)%10007); return 0; }
AC程式碼:
#include <bits/stdc++.h> using namespace std; int Fib(int n) { //a作為f(n),b作為f(n+1) int a = 1, b = 1; for (int i = 1; i < n; i++) { swap(a,b); //更新f(n) b = (a+b)%10007; //更新f(n+1) } return a; } int main() { int n; scanf("%d",&n); printf("%dn",Fib(n)); return 0; }