矩阵一维递推 菲波拉契数
算法:
利用矩阵乘法求解递推,时间复杂度O(lgn)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; #define MAXN 10 #define MOD 2009 int N; class Matrix { public: int mt[MAXN][MAXN]; Matrix Multiply(Matrix); Matrix Add(Matrix); Matrix quickpower(int); void Build(int ); //构造一个m * m维矩阵 void SetSize(int); void SetMod(int); private: int size; // int MOD; }; void Matrix::Build(int n) { size = n; mt[1][1] = 0; mt[1][2] = 1; mt[2][1] = 1; mt[2][2] = 1; } void Matrix::SetMod( int x ) { //MOD = x; } void Matrix::SetSize( int s ) { for( int i = 1; i <= s; i++) for( int j = 1; j <= s; j++) mt[i][j] = 0; size = s; } Matrix Matrix::Add(Matrix A) { Matrix C; for( int i = 1; i <= size; i++) for( int j = 1; j <= size; j++) C.mt[i][j] = mt[i][j] + A.mt[i][j]; return C; } Matrix Matrix::Multiply(Matrix A) { Matrix C; C.size = size; for( int i = 1; i <= size; i++) { for( int j = 1; j <= size; j++) { int sum = 0; for( int k = 1; k <= size; k++) { sum += (A.mt[i][k] % MOD) * (mt[k][j] % MOD); sum %= MOD; } C.mt[i][j] = sum; } } return C; } Matrix Matrix::quickpower(int n) { Matrix Temp1; Temp1.Build(2); size = 2; for( int i = 1; i <= 2; i++) for( int j = 1; j <= 2; j++) mt[i][j] = 1; while( n > 0 ) { if( n&1 ) (*this) = (*this).Multiply(Temp1); n >>= 1; Temp1 = Temp1.Multiply(Temp1); } return *this; } int main( ) { while( scanf("%d",&N), N ) { Matrix A; A.quickpower(N - 1); printf("%d %d\n",A.mt[1][2],A.mt[2][2]); } return 0; }
posted on 2012-08-16 21:28 more think, more gains 阅读(206) 评论(0) 编辑 收藏 举报