题目大意:给出Fibonacci的另一种矩阵求解形式,要求计算f(n)%10000的结果。
解题思路:直接就是矩阵快速幂的求解过程,根据Fibonacci的通项公式可以构造出矩阵,利用矩阵快速幂直接进行求解,详见code。
题目来源:http://poj.org/problem?id=3070
code:
#include <iostream>
#include <cstdio>
using namespace std;
const int MOD = 10000;
int n;
struct matrix{
int m[2][2];
}ans,mat;
matrix multi(matrix a,matrix b){ //矩阵乘法
matrix tmp;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
tmp.m[i][j]=0; //初始化中间矩阵
for(int k=0;k<2;k++)
tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD; //根据题矩阵乘法公式
}
return tmp;
}
int fast_mod(int n){ //快速幂
mat.m[0][0]=mat.m[0][1]=mat.m[1][0]=1; //初始化构造矩阵
mat.m[1][1]=0;
ans.m[0][0]=ans.m[1][1]=1; //初始化单位矩阵
ans.m[0][1]=ans.m[1][0]=0;
while(n){ //矩阵快速幂
if(n&1) ans=multi(ans,mat); //二进制位为1,则乘以中间矩阵
mat=multi(mat,mat); //为0则乘以自己,保证下一位的次方正确
n>>=1;
}
return mat.m[0][1];
}
int main(){
while(scanf("%d",&n)!=EOF && n!=-1)
printf("%d\n",fast_mod(n));
return 0;
}