您的位置:首页 > 其它

矩阵专题:斐波那契数列

2014-04-26 00:03 183 查看
题目描述:

计算斐波那契数列第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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM