矩陣專題:斐波那契數列

題目描述:

計算斐波那契數列第n項的後四位。

大致思路:

斐波那契數列具有以下性質。(由行列式推倒得出)


這樣就可以類似二分的方法求出Fn,只是因爲相鄰兩項性質不可找,所以有重複計算,所以用map優化一下,把計算過的Fn存起來,之後每次直接在map中尋找即可。

代碼:

#include <iostream>
#include <map>

using namespace std;

map<int, int> m;

int f(int n) {
    if (n == 1) return 1;
    else if (n == 2) return 1;
    else if (!n) return 0;
    else if (n == 3) return 2;
    else if (n == 4) return 3;
    if (n%2) {
        int r = n/2, k = r+1;
        int a,b;
        if (m.count(r)) a = m[r];
        else {
            a = f(r);
            m[r] = a;
        }
        if (m.count(k)) b = m[k];
        else {
            b = f(k);
            m[k] = b;
        }
        return (a*a%10000+b*b%10000)%10000;
    }
    else {
        int r = n/2, k = r-1, l = r+1;
        int a,b,c;
        if (m.count(r)) a = m[r];
        else {
            a = f(r);
            m[r] = a;
        }
        if (m.count(k)) b = m[k];
        else {
            b = f(k);
            m[k] = b;
        }
        c = (a+b)%10000;
        m[l] = c;
        return (a*b%10000+a*c%10000)%10000;
    }
}

int main() {
    m.clear();
    int n;
    while (cin>>n, n != -1) {
        cout<<f(n)<<endl;
    }
}


發佈了90 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章