描述
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
题意
已知矩阵A,算A^1+A^2+....+A^k,元素对m取模
二分递归,如果k为偶数,,因为是等比矩阵,所以前一半和后一半就有一个比例,所以sum(1,k)=sum(1,k/2)+sum(1,k/2)*A^(k/2),继续递归下去
如果k为奇数那么最后一项单独考虑sum(1,k)=sum(1,k/2)+sum(1,k/2)*A^(k/2)+A^k,继续递归直到k=1返回A
递归次数为log(k)
#include <bits/stdc++.h> using namespace std; struct d//矩阵 { int a[31][31]; }; int n,k,m; d dw;//单位矩阵 d add(d x,d y)//矩阵加法 { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { x.a[i][j]+=y.a[i][j]; x.a[i][j]%=m; } return x; } d cheng(d x,d y)//矩阵乘法 { d ans; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { ans.a[i][j]=0; for(int kk=1;kk<=n;kk++) { ans.a[i][j]+=x.a[i][kk]*y.a[kk][j]; ans.a[i][j]%=m; } } return ans; } d mi(d x,int b)//矩阵快速幂 { d ans=dw; while(b) { if(b&1) ans=cheng(ans,x); b>>=1; x=cheng(x,x); } return ans; } d A; d aans; d t; d sl(int r)//对(1,r)进行递归 { if(r==1) return A; t=sl(r/2); if(r&1)//奇数 { return add(add(t,cheng(t,mi(A,r/2))),mi(A,r)); } else//偶数 { return add(t,cheng(t,mi(A,r/2))); } } void solve() { cin>>n>>k>>m; for(int i=1;i<=n;i++) dw.a[i][i]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>A.a[i][j]; aans.a[i][j]=0; } aans=sl(k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(j!=1) cout<<" "; cout<<aans.a[i][j]; } cout<<endl; } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // freopen(R"(C:\Users\LENOVO\Desktop\c++\in.txt)","r",stdin); // freopen(R"(C:\Users\LENOVO\Desktop\c++\out.txt)","w",stdout); long long _=1; // cin>>_; while(_--) solve(); }
标签:return,Matrix,递归,int,Series,sum,矩阵,add,Power From: https://www.cnblogs.com/sleepaday/p/17632005.html