矩阵乘法&&快速幂

由线性代数的知识,我们可以在计算机上实现用矩阵来解决某些问题,将一些复杂的方程组用矩阵来表达和计算,当找到类似于递推的关系后,矩阵表达的优越性更能充分体现出来。例子:求出第n个(假设10000内)斐波那契数字对1000000007取模的结果。

这样的问题用一点数论的相关知识也能很快解决(出现的错误undefined reference to winmain 16查了半天居然是main写成了mian,妈妈的吻~):

#include <iostream>
#include<cstdio> 
using namespace std;
long long f[10005]={0,1,1};
const int mod=1e9+7;
int main(){
    int i,n;
	for(i=3;i<10005;i++){
		f[i]=(f[i-1]+f[i-2])%mod;
	}
	while(cin>>n){
		cout<<f[n]<<endl;
	}
	return 0;
}
那么不用这样的方法呢?已知f[n]=f[n-1]+f[n-2],f[1]=f[2]=1。可以得到关系矩阵:

由此建立起矩阵思路,由矩阵乘法来推导f[n]的关系,同时可以把快速幂的思想应用于此:

#include <iostream>
#include<cstdio>
using namespace std; //求第n个feibo数mod1000000007的值
typedef long long LL;
const int mod=1e9+7;
struct matrix{
	LL m[2][2];
};
matrix A={
    1,1,
	1,0
};
matrix I={
    1,0,
    0,1
};
matrix multi(matrix a,matrix b){
	matrix c={0};//后面的数字直接取0了,但如果是{0,1}则只有第二个数字是1,其他都为0
	for(int i=0;i<2;i++){
		for(int j=0;j<2;j++){
			for(int k=0;k<2;k++){
			    c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;
			}
			c.m[i][j]%=mod;
		}
	}
	return c;
}
matrix power(matrix a,int k){
	matrix c=I;
	while(k){
		if(k&1){
			c=multi(c,a);
			k--;
		}
		k>>=1;
		a=multi(a,a);
	}
	return c;
}
void show(matrix a){
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            cout<<a.m[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main(int argc, char *argv[]) {
	int n;
	while(cin>>n){
		matrix ans=power(A,n-1);
		cout<<ans.m[0][0]<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值