S = A + A2 + A3 + … + Ak. (推矩阵公式+矩阵幂运算)

                          Matrix Power Series

 

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const double EXP=1e-5;
18 const int MS=31;
19 const int SIZE=1000;
20 
21 int n,k,mod;
22 typedef vector<vector<int> > mat;
23 
24 mat A;
25   //  calc   A*B
26 
27 mat mul(mat &A,mat &B)
28 {
29   mat C(A.size(),vector<int>(B[0].size()));
30 
31   for(int i=0;i<A.size();i++)
32   {
33         for(int k=0;k<B.size();k++)
34         {
35               for(int j=0;j<B[0].size();j++)
36               {
37                     C[i][j]=(C[i][j]+(LL)A[i][k]*B[k][j])%mod;    //  note   overflow
38               }
39         }
40   }
41   return C;
42 }
43 
44   //   calc  A^n
45 
46   mat pow(mat A,int n)
47   {
48         mat B(A.size(),vector<int>(A[0].size()));
49         for(int i=0;i<A.size();i++)
50             B[i][i]=1;
51         while(n>0)
52         {
53               if(n&1)
54                   B=mul(B,A);
55               A=mul(A,A);
56               n>>=1;
57         }
58         return B;
59   }
60 
61 void solve()
62 {
63       mat B(2*n,vector<int>(2*n));     //  init   0
64       //   B_init();
65       for(int i=0;i<n;i++)
66       {
67             for(int j=0;j<n;j++)
68                   B[i][j]=A[i][j];
69             B[n+i][i]=B[n+i][n+i]=1;
70       }
71       B=pow(B,k+1);
72       //    ans=s[k+1]-1;
73       for(int i=0;i<n;i++)
74       {
75             for(int j=0;j<n;j++)
76             {
77                   if(j)
78                         printf(" ");
79                   int a=B[n+i][j]%mod;
80                   if(i==j)
81                         a=(a+mod-1)%mod;
82                   printf("%d",a);
83             }
84             printf("\n");
85       }
86 }
87 
88 int main()
89 {
90       scanf("%d%d%d",&n,&k,&mod);
91       A.resize(n);
92       for(int i=0;i<n;i++)
93             A[i].resize(n);
94       for(int i=0;i<n;i++)
95             for(int j=0;j<n;j++)
96                   scanf("%d",&A[i][j]);
97       solve();
98       return 0;
99 }

 

posted @ 2015-04-05 22:13  daydaycode  阅读(202)  评论(0编辑  收藏  举报