关键思路
(1)从递推公式求解状态转移方程->转移矩阵
f(n)= f(n-1)+f(n-2)
[f(n),f(n-1)] = [ f(1), f(2)] * [(1,1);(1,0)]^(n-2)
(2)优化求矩阵的幂问题!!!
#include <iostream>
using namespace std;
void matrixMulti(int const m1[][2],int const m2[][2], int res[][2]){
for(int i = 0; i <2; i++)
for(int j = 0; j < 2 ; j++)
res[i][j] = m1[i][0]*m2[0][j] + m1[i][1]*m2[1][j];
}
int matrixPower( int* a ,int matrix[][2] ,int order){
int temp[][2] = {{1,0},{0,1}};
// int** res = new int* [2];
// for(int i = 0; i < 2; i ++)
// res[i] = new int[2];
int res[2][2];
for(; order!= 0 ; order>>=1){
if((order&1) != 0){
matrixMulti(temp,matrix,res);
for(int i = 0 ; i < 2; i++)
for(int j = 0 ; j<2; j++)
temp[i][j] = res[i][j];
}
matrixMulti(matrix,matrix,res);
for(int i = 0 ; i < 2; i++)
for(int j = 0 ; j<2; j++)
matrix[i][j] = res[i][j];
}
return a[0]*temp[0][0] + a[1]*temp[1][0];
}
int f1(int n){
int res;
if( n==1 || n ==2 )
return 1;
if(n<0)
return 0;
/*
* [f(n),f(n-1)] = [ f(1), f(2)] * [(1,1);(1,0)]^(n-2)
*/
int matrix[2][2] = {{1,1},{1,0}};
int base[2] = {1,1};
return matrixPower( base ,matrix ,n-2);
}
int main()
{
int N;
while(cin>>N)
{
for(int i = 1; i <=N; i++)
cout<<f1(i)<<" ";
cout<<endl;
}
}