pojFibonacci
题目链接:http://poj.org/problem?id=3070
对于昨天未完成的矩阵快速幂计算斐波那契数列的完善
实际上这道题给的暗示已经很明显了,比昨天拿到题明显简单多了。
而这道题倒是给出了一维斐波那契递推式转化成二维斐波那契矩阵的基本原理和计算方法;
而对于这道题的计算,将第一个二维斐波那契矩阵的值按照它的要求赋值即可,然后在进行快速幂矩阵运算;
Talk is cheap. Show me the code.
1 #include<stdio.h> 2 #include<iostream>//注意头文件 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=2; 7 const int mod=10000; 8 struct matrix{//定义矩阵 9 int m[maxn][maxn]; 10 matrix() 11 { 12 memset(m,0,sizeof(m)); 13 } 14 }; 15 matrix multi(matrix a,matrix b)//矩阵乘法运算 16 { 17 matrix res; 18 for(int i=0;i<maxn;i++) 19 { 20 for(int j=0;j<maxn;j++) 21 { 22 for(int k=0;k<maxn;k++) 23 { 24 res.m[i][j]=(res.m[i][j]+a.m[i][k]*b.m[k][j])%mod; 25 } 26 } 27 } 28 return res; 29 } 30 matrix fastm(matrix a,int n)//快速幂运算 31 { 32 matrix res; 33 for(int i=0; i<maxn; i++) 34 res.m[i][i] = 1; 35 while(n) { 36 if(n&1) 37 res = multi(res, a); 38 a = multi(a, a); 39 n>>=1; 40 } 41 return res; 42 } 43 int main() 44 { 45 int n; 46 while(scanf("%d",&n)&&n!=-1) 47 { 48 matrix res; 49 matrix a;//按照要求对四个值进行赋值 50 a.m[0][0]=1; 51 a.m[0][1]=1; 52 a.m[1][0]=1; 53 a.m[1][1]=0; 54 res=fastm(a,n); 55 int ans=res.m[0][1]%mod; 56 if(ans==0) 57 cout<<'0'<<endl; 58 else 59 printf("%d\n",res.m[0][1]); 60 } 61 return 0; 62 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16220372.html