题意:给你一个矩阵A,求A+A^2+A^3+...+A^n的矩阵,输出这个矩阵的最后一位数字
思路:大神博客链接 :点我
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> using namespace std; typedef long long ll; int N,M,P; const ll MOD=10; struct Matrix { ll m[45][45]; }; Matrix A; Matrix I; void make_I(int k) { memset(I.m,0,sizeof(I.m)); for(int i=0;i<k;i++) I.m[i][i]=1; } Matrix multi(Matrix a,Matrix b) { Matrix ans; for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { ans.m[i][j]=0; for(int k=0;k<P;k++) { ans.m[i][j]+=a.m[i][k]*b.m[k][j]%MOD; } ans.m[i][j]%=MOD; } } return ans; } Matrix add(Matrix a,Matrix b) { Matrix ans; for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { ans.m[i][j]=0; ans.m[i][j]=(a.m[i][j]+b.m[i][j])%MOD; } } return ans; } Matrix power(Matrix a,int k) { Matrix ans=I,p=a; while(k) { if(k&1) { ans=multi(ans,p); } k>>=1; p=multi(p,p); } return ans; } Matrix slove(const Matrix &a,int n) { if(n==1) return a; Matrix temp=slove(a,n/2); Matrix sum=add(temp,multi(temp,power(a,n/2))); if(n&1) sum=add(sum,power(a,n)); return sum; } int main(int argc, char const *argv[]) { int n,k; while(cin>>n>>k) { if(n==0) break; M=N=P=n; memset(A.m,0,sizeof(A.m)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%lld",&A.m[i][j]); A.m[i][j]%=10; } } make_I(n); Matrix ans = slove(A,k); for(int i=0;i<n;i++) { for(int j=0;j<n-1;j++) { cout<<ans.m[i][j]<<" "; } cout<<ans.m[i][n-1]<<endl; } cout<<endl; } return 0; }