矩阵快速幂

矩阵快速幂求斐波那契数
本文介绍了一种使用矩阵快速幂方法高效计算斐波那契数的方法,并提供了一个C++实现示例,该方法特别适用于解决递推取模问题。

用矩阵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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值