题目大意:给定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 }
Matrix Power Series(POJ 3233 构造新矩阵求解+ 快速矩阵幂)
原文:http://www.cnblogs.com/a1225234/p/5294848.html