题目描述:
计算斐波那契数列第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;
}
}