用矩阵m=[1,1;1,0]的n-2次幂乘A=[1,1],可以求得斐波那契数f(n),不过到100就19位数了(3736710778780434371)。
下面是c++的代码求f(n)。留着以后遇到类似的直接用,改改就能秒hdu1005,hdu1575,poj3070了。
#include
using namespace std;
class matrix{
long long m[2][2];
public:
matrix (){
m[0][0]=m[0][1]=m[1][0]=m[1][1]=0;
}
long long get(int row,int colum);
void initial(int a11,int a12,int a21,int a22);
matrix operator*(matrix a);
};
matrix powe(matrix a,int n);
int main()
{
matrix ma;
ma.initial(1,1,1,0);
int A[2][1]={1,1};
long long n=10,fib_n;
cin>>n;
if(n<=2)
fib_n=1;
else{
matrix b=powe(ma,n-2);
fib_n=b.get(0,0)*A[0][0]+b.get(0,1)*A[1][0];
}
cout<<fib_n<<endl;
return 0;
}
void matrix::initial(int a11,int a12,int a21,int a22)
{
m[0][0]=a11;
m[0][1]=a12;
m[1][0]=a21;
m[1][1]=a22;
}
matrix matrix::operator*(matrix a)
{
matrix b;
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
for(int k=0;k<2;++k)
b.m[i][j]+=m[i][k]*a.m[k][j];
}
}
return b;
}
matrix powe(matrix a,int n)
{
if(n==1)
return a;
else if(n%2==0)
return powe(a*a,n/2);
else
return powe(a*a,n/2)*a;
}
long long matrix::get(int row,int colum)
{
return m[row][colum];
}