首先来看一下定义:
看不懂?那么用循环思想来解释一下;
首先你要知道,只有在第一个矩阵的列数和第二个矩阵的行数相同时乘法才有意义。
那么,对于答案C在(i,j)上的元素,可以理解为A的第i行和B的第j列上的乘积和~;
所以在进行矩阵加速的时候,可以通过枚举i,j,k来进行计算;
下面以著名的斐波那契数列来进行代码的实现:
#include <bits/stdc++.h>
#define p 1000000007
using namespace std;
long long st[10][10];
long long tmp[10][10];
long long a[10][10];
void cheng1()
{
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
tmp[1][i]+=(st[1][j]*a[j][i])%p;
tmp[i][j]%p;
}
}
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
st[i][j]=tmp[i][j];
}
}
}
void cheng2()
{
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
tmp[i][j]+=(a[k][j]*a[i][k])%p;
tmp[i][j]%=p;
}
}
}
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
a[i][j]=tmp[i][j];
}
}
}
void JZKSM(long long n)
{
while(n){
if(n&1) cheng1();
cheng2();
n/=2;
}
}
int main()
{
long long n;
cin>>n;
a[1][1]=1,a[1][2]=1,a[2][1]=1;
st[1][1]=1,st[1][2]=1;
JZKSM(n-2);
if(n==1||n==2){
cout<<"1";
return 0;
}
cout<<st[1][1]%p;
}