矩阵

矩阵的乘法:

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("\n\n");
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("\n");
59         }
60     }
61     return 0;
62 }
View Code

 

posted @ 2015-05-23 11:51  草滩小恪  阅读(183)  评论(0编辑  收藏  举报