Matrix Power Series(POJ 3233 构造新矩阵求解+ 快速矩阵幂)

题目大意:给定A,k,m(取模),求解S = A + A2 + A3 + … + Ak.

思路:此题为求解幂的和,一开始直接一个个乘,TLE。时间消耗在累加上。此处巧妙构造新矩阵

p=    A 0

    1 1   ,1 代表单位矩阵。那么p*p=A 0

                    A+1,1

p*p*p=A*A 0

    A*A+A+1 1

那么最后求得的结果就是左下角的矩阵减去一个单位矩阵。最后需要注意的是若在简单为矩阵的时候结果为负数,那么为m-1;

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 
 8 typedef vector<int> vec;
 9 typedef vector<vec> mat;
10 
11 mat a,b;
12 int n,k,m;
13 mat mul(mat x,mat y)
14 {
15     mat c(2*n,vec(2*n));
16     int sum;
17     int i,j,w;
18     for(i=0;i<2*n;i++)
19         for(j=0;j<2*n;j++)
20         {
21             sum=0;
22             for(w=0;w<2*n;w++)
23                 sum=(sum+x[i][w]*y[w][j])%m;
24             c[i][j]=sum;
25         }
26     return c;
27 }
28 
29 mat m_pow(mat x,int p)
30 {
31     mat res(2*n,vec(2*n));
32     int i;
33     for(i=0;i<2*n;i++)
34         res[i][i]=1;
35     while(p>0)
36     {
37         if(p&1)
38             res=mul(res,x);
39         x=mul(x,x);
40         p>>=1;
41     }
42     return res;
43 }
44 
45 int main()
46 {
47     int i,j,x;
48     freopen("in.txt","r",stdin);
49     cin>>n>>k>>m;
50     mat a(2*n,vec(2*n));
51     
52     for(i=0;i<n;i++)
53         for(j=0;j<n;j++)
54             cin>>a[i][j];
55     for(i=0;i<n;i++)
56         for(j=n;j<2*n;j++)
57             a[i][j]=0;
58     for(i=n;i<2*n;i++)
59         a[i][i-n]=a[i][i]=1;
60 
61     a=m_pow(a,k+1);
62     
63     for(i=n;i<2*n;i++)
64     {
65         for(j=0;j<n;j++)
66         {
67             if((i-j)==n)
68                 a[i][j]--;
69             if(a[i][j]<0)
70                 a[i][j]+=m;
71             cout<<a[i][j]<<" ";
72         }
73         cout<<endl;
74     }
75     return 0;
76 }

 

posted @ 2016-03-19 12:44  御心飞行  阅读(259)  评论(0编辑  收藏  举报