1.矩阵的乘法。
int a[10][20],b[20][30];
int c[10][30];
int i,j,k;
memset(c,0,sizeof(c));
for(i=0;i<10;i++)
{
for(j=0;j<30;j++)
{
for(k=0;k<20;k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
2.利用矩阵快速幂求解斐波那契数列
当求斐波那契数列1e10的项的时候非常容易超时利用矩阵求斐波那契数列
斐波那契数列递推式为F(n)=F(n-1)+F(n-2) (n>=2)
F(0)=0,F(1)=1 根据递推式我们可以列出两个方程:F(n)=F(n-1)+F(n-2)和F(n-1)=F(n-2)+F(n-3)
由此
即
3.快速幂模板
#include<stdio.h>
#include<cstring>
#define LL long long
#define M 10
#define MOD 1000000007
struct Matrix{
LL matrix[M][M];
};
int n;//矩阵的阶数
void init(Matrix &res){
for(int i=0;i<=n;i++)//单位矩阵
{
for(int j=0;j<=n;j++)
res.matrix[i][j]=0;
res.matrix[i][i]=1;
}
}
Matrix multiplicative(Matrix a,Matrix b){
Matrix res;
memset(res.matrix,0,sizeof(res.matrix));
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++)
for(int k = 0 ; k < n ; k++)
res.matrix[i][j] =(res.matrix[i][j]%MOD+a.matrix[i][k]%MOD*b.matrix[k][j]%MOD)%MOD;
return res;
}
Matrix pow(Matrix mx,int m){
Matrix res,base=mx;
init(res); //初始为单位矩阵,即除主对角线都是1外,其他都是0
while(m)
{
if(m&1)
res=multiplicative(res,base);
base=multiplicative(base,base);
m>>=1;
}
return res;
}
int main(){
int m;
n=2;
scanf("%d",&m);
Matrix base,res;
base.matrix[0][0]=base.matrix[0][1]=base.matrix[1][0]=1;
base.matrix[1][1]=0;
res=pow(base,m-1);
if(m==0)
puts("0");
else if(m==1)
puts("1");
else
printf("%lld\n",res.matrix[0][0]%MOD);
return 0;
}