• 矩阵


    矩阵的乘法:

    Matrix:

    乘法: A*B ,需要A的列数=B的行数

    矩阵 C = A*B

    则: C[i,j] = ∑A[i,k]*B[k,j]

     矩阵的乘法代码:

    //矩阵的乘法 
    
    void mul(int A[][MAXN],int B[][MAXN])//A=A*B
    {
            int R[MAXN][MAXN];
            memset(R,0,sizeof(R));
            for(int k=0;k<N;k++)
                for(int i=0;i<N;i++)if(A[i][k])
                    for(int j=0;j<N;j++)
                        R[i][j]+=A[i][k]*B[k][j];
            /*
                如果取余可能能加快计算 
                int R[MAXN][MAXN];
                for(int i=0;i<N;i++)
                    for(int j=0;j<N;j++)
                    {
                        long long sum = 0;
                        for(int k=0;k<N;k++)
                            sum+=A[i][k]*B[k][j];
                        R[i][j]=sum%MOD;
                    }
            */
            for(int i=0;i<N;i++)
                for(int j=0;j<N;j++)
                    A[i][j]=R[i][j];
    }

    矩阵快速幂模板:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 int n, k, M;
     6 struct mat{
     7     int ma[65][65];
     8     mat() {memset(ma, 0, sizeof(ma));}//¹¹ÔìÁã¾ØÕó 
     9     mat(int a)  //¹¹Ô쵥λ¾ØÕó 
    10     {
    11         memset(ma, 0, sizeof(ma));
    12         for(int i=0; i<n; i++)
    13         ma[i][i] = 1;
    14     }
    15     void operator *= (const mat &x)//¾ØÕó³Ë·¨ 
    16     {
    17         mat tmp;
    18         int i, j, k;
    19         for( k=0; k<n; k++)
    20         for( i=0; i<n; i++)
    21         if(ma[i][k])
    22         {   long long tot=0; 
    23             for( j=0; j<n; j++)
    24                 tot += ma[i][k]*x.ma[k][j];
    25                 ma[i][j] = tot%M;
    26         }
    27         for(i=0; i<n; i++)
    28         for(j=0; j<n; j++)
    29         ma[i][j] = tmp.ma[i][j];
    30     }
    31 };
    32 mat pow_mod(mat a, int b)//¾ØÕó¿ìËÙÃÝ 
    33 {
    34     mat tmp = mat(1);
    35     while(b>0)
    36     {
    37         if(b&1) tmp*=a;
    38         b>>=1;
    39         a*=a;
    40     }
    41     return tmp;
    42 }
    43 
    44 int main()
    45 {
    46     while(scanf("%d%d%d", &n, &k, &M)==3)
    47     {
    48         mat A, B;
    49         for(int i=0; i<n; i++)
    50         for(int j=0; j<n; j++)
    51         scanf("%d", &A.ma[i][j]);
    52         printf("
    
    ");
    53         mat ans = pow_mod(A, k+1);
    54         for(int i=0; i<n; i++)
    55         {
    56             for(int j=0; j<n; j++)
    57             printf("%8d", ans.ma[i][j]);
    58             printf("
    ");
    59         }
    60     }
    61     return 0;
    62 }
    View Code
  • 相关阅读:
    mysql 查看存储过程 并导出
    mysql 添加记录或者删除记录
    mysql 修改表的字段
    搭建docker私有仓库
    安装gitlab并配置邮箱
    Mac 安装MySQL-python
    android studio 调试安装
    给定日期求星期几
    数字三角形
    程序设计实训-课程表管理系统项目中遇到的问题
  • 原文地址:https://www.cnblogs.com/acm1314/p/4523922.html
Copyright © 2020-2023  润新知