题目链接:http://poj.org/problem?id=3070
题意:求斐波那契数列Fn的值的后四位数,(0<=n<=1000,000,000)
思路:由于n很大,o(n)会超时,所以使用矩阵快速幂,时间复杂度降为o(logn)。
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
struct matrix{
int a[2][2];
};
matrix mul(matrix x,matrix y){
matrix z;
memset(z.a,0,sizeof(z.a));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
z.a[i][j]+=x.a[i][k]*y.a[k][j];
z.a[i][j]%=10000;
}
}
}
return z;
}
matrix matrix_pow(matrix br,int n){
matrix res;
memset(res.a,0,sizeof(res.a));
res.a[0][0]=1;res.a[1][1]=1;
while(n){
if(n&1){
res=mul(res,br);
}
n>>=1;
br=mul(br,br);
}
return res;
}
int main (){
int n;
matrix res,en;
while(cin>>n&&n!=-1){
if(n==0) {cout<<"0"<<endl;continue;}
res.a[0][0]=1;
res.a[0][1]=1;
res.a[1][0]=1;
res.a[1][1]=0;
en=matrix_pow(res,n);
cout<<en.a[0][1]<<endl;
}
}