题目D - Fibonacci POJ - 3070
//递推f(n)=f(n-1)+f(n-2);
//但当n很大到1e9的时候,可以运用矩阵的知识,矩阵快速幂
//讲下矩阵快速幂在Fibonacii中的运用


```cpp
//原来其实递推就好了f(n)=f(n-1)+f(n-2);
//但当n很大到1e9的时候,可以运用矩阵的知识,矩阵快速幂
//讲下矩阵快速幂在Fibonacii中的运用
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int MAXN=2;
const int MOD=1e4;
//定义矩阵结构体
struct Matrix{
int m[MAXN][MAXN];
Matrix(){
memset(m,0,sizeof(m));
}
};
//定义矩阵乘法
Matrix Multi(Matrix a,Matrix b){
Matrix res;
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXN;j++){
for(int k=0;k<MAXN;k++){
res.m[i][j]=(res.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;//****非常主要,是矩阵计算的核心
}
}
}
return res;
}
//矩阵快速幂
Matrix fastm(Matrix a,int n){
Matrix res;
for(int i=0;i<MAXN;i++){
//初始化为单位矩阵,相当于前面程序的int res=1;
res.m[i][i]=1;
}
while(n){
if(n&1) res=Multi(res,a);
a=Multi(a,a);
n>>=1;
}
return res;
}
int main(){
Matrix st,f;
st.m[0][0]=1;
st.m[0][1]=1;
st.m[1][0]=1;
st.m[1][1]=0;
int n;
while(cin >> n&&n!=-1){
f=fastm(st,n);
cout << f.m[0][1] << endl;
}
return 0;
}
2391

被折叠的 条评论
为什么被折叠?



