[关闭]
@xiaoziyao 2020-06-02T18:41:28.000000Z 字数 6561 阅读 1363

矩阵学习笔记

数学 学习笔记


定义

矩阵的定义

矩阵是一个按照长方阵列排列的复数或实数集合
例如:

矩阵的运算

  1. 矩阵的加法
    必须相同大小的矩阵才能进行加法
  2. 矩阵的减法
    必须相同大小的矩阵才能进行加法
  3. 矩阵的数乘
  4. 矩阵的乘法
    只有第一个矩阵的列数=第二个矩阵的行数才能进行乘法

  5. 矩阵的乘方(快速幂)

    矩阵的乘方可以用快速幂在O(log n)内求出结果

单位矩阵

在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。
单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。

矩阵的性质


1. 矩阵的加法满足交换律

2. 矩阵的加法满足结合律

3. 矩阵的数乘满足结合律

4. 矩阵的数乘满足分配律

5. 矩阵的乘法不满足交换律

6. 矩阵的乘法满足结合律

7. 矩阵的乘法满足分配律

dp的矩阵加速

例1:斐波那契数列

例2:【模板】矩阵加速(数列)

  1. #include<stdio.h>
  2. const long long mod=1000000007;
  3. long long i,j,k,m,n,T;
  4. struct matrix{
  5. int len,wid;
  6. long long mt[105][105];
  7. }ans;
  8. matrix mul(matrix a,matrix b){
  9. matrix res;
  10. res.len=a.len,res.wid=b.wid;
  11. for(int u=1;u<=a.len;u++)
  12. for(int v=1;v<=b.wid;v++)
  13. res.mt[u][v]=0;
  14. for(int u=1;u<=a.len;u++)
  15. for(int v=1;v<=b.wid;v++)
  16. for(int w=1;w<=a.wid;w++)
  17. res.mt[u][v]+=(a.mt[u][w]*b.mt[w][v])%mod,res.mt[u][v]%=mod;
  18. return res;
  19. }
  20. long long calc(long long b){
  21. matrix a,res;
  22. a.len=a.wid=3;
  23. a.mt[1][1]=a.mt[1][3]=a.mt[2][1]=a.mt[2][2]=a.mt[3][2]=0;
  24. a.mt[1][2]=a.mt[2][3]=a.mt[3][1]=a.mt[3][3]=1;
  25. res.len=1,res.wid=3;
  26. res.mt[1][1]=res.mt[1][2]=res.mt[1][3]=1;
  27. while(b){
  28. if(b&1)
  29. res=mul(res,a);
  30. a=mul(a,a),b>>=1;
  31. }
  32. return res.mt[1][3];
  33. }
  34. int main(){
  35. scanf("%lld",&T);
  36. while(T--){
  37. scanf("%lld",&n);
  38. if(n<=3){
  39. puts("1");
  40. continue;
  41. }
  42. printf("%lld\n",calc(n-3));
  43. }
  44. return 0;
  45. }
  1. #include<stdio.h>
  2. const long long mod=1000000007;
  3. long long i,j,k,m,n,T;
  4. struct matrix{
  5. int len,wid;
  6. long long mt[105][105];
  7. }ans;
  8. matrix mul(matrix a,matrix b){
  9. matrix res;
  10. res.len=a.len,res.wid=b.wid;
  11. for(int u=1;u<=a.len;u++)
  12. for(int v=1;v<=b.wid;v++)
  13. res.mt[u][v]=0;
  14. for(int u=1;u<=a.len;u++)
  15. for(int v=1;v<=b.wid;v++)
  16. for(int w=1;w<=a.wid;w++)
  17. res.mt[u][v]+=(a.mt[u][w]*b.mt[w][v])%mod,res.mt[u][v]%=mod;
  18. return res;
  19. }
  20. long long calc(long long b){
  21. matrix a,res;
  22. a.len=a.wid=3;
  23. a.mt[1][2]=a.mt[2][2]=a.mt[2][3]=a.mt[3][1]=a.mt[3][3]=0;
  24. a.mt[1][1]=a.mt[1][3]=a.mt[2][1]=a.mt[3][2]=1;
  25. res.len=1,res.wid=3;
  26. res.mt[1][1]=res.mt[1][2]=res.mt[1][3]=1;
  27. while(b){
  28. if(b&1)
  29. res=mul(res,a);
  30. a=mul(a,a),b>>=1;
  31. }
  32. return res.mt[1][1];
  33. }
  34. int main(){
  35. scanf("%lld",&T);
  36. while(T--){
  37. scanf("%lld",&n);
  38. if(n<=3){
  39. puts("1");
  40. continue;
  41. }
  42. printf("%lld\n",calc(n-3));
  43. }
  44. return 0;
  45. }
  1. #include<stdio.h>
  2. const long long mod=1000000007;
  3. long long i,j,k,m,n,T;
  4. struct matrix{
  5. int len,wid;
  6. long long mt[105][105];
  7. }ans;
  8. matrix mul(matrix a,matrix b){
  9. matrix res;
  10. res.len=a.len,res.wid=b.wid;
  11. for(int u=1;u<=a.len;u++)
  12. for(int v=1;v<=b.wid;v++)
  13. res.mt[u][v]=0;
  14. for(int u=1;u<=a.len;u++)
  15. for(int v=1;v<=b.wid;v++)
  16. for(int w=1;w<=a.wid;w++)
  17. res.mt[u][v]+=(a.mt[u][w]*b.mt[w][v])%mod,res.mt[u][v]%=mod;
  18. return res;
  19. }
  20. long long calc(long long n){
  21. long long b=(n-1)/3;
  22. matrix a,res;
  23. a.len=a.wid=3;
  24. a.mt[3][2]=0;
  25. a.mt[1][2]=a.mt[1][3]=a.mt[2][1]=a.mt[2][2]=a.mt[2][3]=a.mt[3][1]=a.mt[3][3]=1;
  26. a.mt[1][1]=2;
  27. res.len=1,res.wid=3;
  28. res.mt[1][1]=res.mt[1][2]=res.mt[1][3]=1;
  29. while(b){
  30. if(b&1)
  31. res=mul(res,a);
  32. a=mul(a,a),b>>=1;
  33. }
  34. return res.mt[1][n%3+1];
  35. }
  36. int main(){
  37. scanf("%lld",&T);
  38. while(T--){
  39. scanf("%lld",&n);
  40. if(n<=3){
  41. puts("1");
  42. continue;
  43. }
  44. printf("%lld\n",calc(n));
  45. }
  46. return 0;
  47. }

题单

LOJ

洛谷

POJ

HDU

ZOJ

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注