因为一个线性递推做不出来码一个矩阵快速幂的板子
先是一个矩阵乘法的部分
double * Matrix (double *a,double *b,double*res,int m,int r,int n){//矩阵乘法,返回结果指针
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
res[m*i+j]=0;
for (int k=0;k<r;k++)res[n*i+j]+=a[i*r+k]*b[k*n+j];
}
}
return res;
}
然后类似快速幂直接码一个就行了
double * qpow(double *a,int n,int m){//矩阵快速幂,返回幂后的指针
double *p=(double *)malloc(sizeof(double)*n*n);
double *res=(double*)malloc(sizeof(double)*n*n);
double *tmp;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
if(i==j)p[i*n+j]=1;
else p[i*n+j]=0;
}//初始化p为In
while (m>0){
if (m%2)Matrix(a,p,res,n,n,n);
tmp=p;
p=res;
res=p;
Matrix(a,a,res,n,n,n);
tmp=a;
a=res;
res=tmp;
m/=2;
}
return p;
}
然后稍微写一下矩阵快速幂在切线性递推题中的妙用不过不知道怎么导入公式
大致意思就是线性递推可以写成一个nn的矩阵左乘一个n1的矩阵然后迭代。