題目描述:
計算斐波那契數列第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;
}
}