概念
常见用语
同型矩阵
两个矩阵A,B,如果都是m行n列的,称他们是同型矩阵
n阶矩阵
n行n列的矩阵,称为n阶矩阵或方阵
行矩阵:只有一行的矩阵
列矩阵:只有一列的矩阵
零矩阵:元素都是0的矩阵
单位矩阵
从左上角到右下角的直线(叫做主对角线)上元素都是1,其他元素都是0
计算
加
减
乘
矩阵乘数:
矩阵乘矩阵:
矩阵快速幂(模板)
#include<bits/stdc++.h>
#define ll long long
#define db double
#define mod 1000000007
using namespace std;
inline ll read()
{
ll x=0,f=1;
char ch;
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
ll n,k;
struct matrix
{
ll a[105][105];
matrix(int t=0)
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) a[i][i]=t;
}
inline matrix operator *(const matrix &A)
{
matrix ans(0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
ans.a[i][j]=(ans.a[i][j]+a[i][k]*A.a[k][j]%mod)%mod;
}
}
}
return ans;
}
friend inline matrix operator ^(matrix A,ll b)
{
matrix ans(1);
while(b)
{
if(b&1) ans=ans*A;
A=A*A;
b/=2;
}
return ans;
}
}A;
int main()
{
n=read();
k=read();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
A.a[i][j]=read();
}
}
A=A^k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%lld ",A.a[i][j]);
}
printf("\n");
}
return 0;
}
例题:求斐波那契数列的第n项;
代码:
#include<bits/stdc++.h>
#define ll long long
#define db double
#define mod 1000000007
using namespace std;
inline ll read()
{
ll x=0,f=1;
char ch;
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
ll n;
struct matrix
{
ll a[3][3];
matrix(){memset(a,0,sizeof(a));}
inline matrix operator *(const matrix &A)const
{
matrix ans;
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
ans.a[i][j]=(ans.a[i][j]+a[i][k]*A.a[k][j]%mod)%mod;
}
}
}
return ans;
}
friend inline matrix operator ^(matrix A,ll b)
{
matrix e;
e.a[1][1]=1;
e.a[1][2]=0;
e.a[2][1]=0;
e.a[2][2]=1;
while(b)
{
if(b&1) e=A*e;
A=A*A;
b/=2;
}
return e;
}
};
int main()
{
n=read();
if(n<=2)
{
printf("1");
return 0;
}
matrix ans;
ans.a[1][1]=1;
ans.a[1][2]=1;
ans.a[2][1]=1;
ans.a[2][2]=0;
ans=ans^(n-1);
printf("%lld\n",ans.a[1][1]);
}